Script 1 for Kitchel et al.Ā 2023 in prep taxonomic diversity manuscript.

library(tidyverse)
library(sp)
library(raster)
#library(rgeos)
library(rgbif)
library(viridis)
library(gridExtra)
library(rasterVis)
library(concaveman)
library(sf)
library(cowplot)
library(data.table)
set.seed(1)

Pull in compiled and cleaned data from FishGlob downloaded on November 28 2022 (V 1.5). This is typically compiled by Dr.Ā Aurore Maureaud. This includes public and private data and therefore link cannot be shared. However with editing you can run analyses for public trawl surveys.

Survey code Survey name short Survey name long Agency Region Access Provider/link to access Inclusion
AI Aleutian Islands Aleutian Islands National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
BITS-1 Baltic Sea Q1 Baltic Sea Quarter 1 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
BITS-4 Baltic Sea Q4 Baltic Sea Quarter 4 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
CHL Chile Chile Universidad de Concepción, Chile South America Requires data request Daniela Yepson and Luis Cubillos Included
COL Colombia Colombian Caribbean Universidad Nacional de Colombia South America Requires data request Camilo B. Garcia Too few years
DFO-HS Hecate Strait Hecate Strait Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/780a1c02-1f9c-4994-bc70-a0e9ef8e3968 and OceanAdapt: https://zenodo.org/records/8103080 Too few years
DFO-NF Newfoundland Newfoundland Department of Fisheries and Oceans Canada Requires data request Mariano Koen-Alonso Included
DFO-QCS Queen Charlotte Sound Queen Charlotte Sound Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/a278d1af-d567-4964-a109-ae1e84cbd24a and OceanAdapt: https://zenodo.org/records/8103080 Included
DFO-SOG Strait of Georgia Straight of Georgia Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/d880ba18-8790-41a2-bf73-e9247380759b and OceanAdapt: https://zenodo.org/records/8103080 Too few years
DFO-WCHG West Coast Haida Gwaii West Coast Haida Gwaii Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/5ee30758-b1d6-49fe-8c4e-5136f4b39ad1 and OceanAdapt: https://zenodo.org/records/8103080 Too few years
DFO-WCVI West Coast Vancouver Island West Coast Vancouver Island Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/557e42ae-06fe-426d-8242-c3107670b1de and OceanAdapt: https://zenodo.org/records/8103080 Too few years
EBS Eastern Bering Sea Eastern Bering Sea National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
EVHOE Bay of Biscay Bay of Biscay International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
FALK Falkland Islands Falkland Islands Falkland Islands Fisheries Department Southern Ocean Requires data request Alexander Arkhipkin and Jorge Ramos Excluded after spatial temporal standardization in next script
FR-CGFS English Channel English Channel International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
GIN Guinea Guinea National Center of Fisheries Sciences of Boussoura, Conakry, Republic of Guinea Africa Requires data request Mohammed Lamine Camara Inconsistent sampling through space and time
GMEX-Summer Gulf of Mexico Summer Gulf of Mexico Summer National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
GMEX-Fall Gulf of Mexico Fall Gulf of Mexico Fall National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
GOA Gulf of Alaska Gulf of Alaska National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
GRL-DE Greenland Greenland Thuenen Institute of Sea Fisheries Europe Requires data request Karl-Michael Werner Included
GSL-N N Gulf of St.Ā Lawrence Northern Gulf of St.Ā Lawrence Department of Fisheries and Oceans Canada Public See OceanAdapt: https://zenodo.org/records/8103080 for specific DFO links Included
GSL-S S Gulf of St.Ā Lawrence Southern Gulf of St.Ā Lawrence Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/1989de32-bc5d-c696-879c-54d422438e64 and OceanAdapt: https://zenodo.org/records/8103080 Included
ICE-GFS Iceland Iceland Marine and Freshwater Research Institute, Iceland Europe Requires data request Jón Sólmundsson Included
IE-IGFS Irish Sea Irish Sea International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
IS-TAU Israel Israel Tel Aviv University Asia Requires data request Jonathan Belmaker Too few years
IS-MOAG Israel Israel Israeli Ministry of Agriculture Asia Requires data request Oren Sonin and Dori Edelist Inconsistent sampling through space and time
MEDITS Mediterranean Mediterranean Multiple Europe Requires data request Contact corresponding author for contacts Included
MRT Mauritania Mauritania Institut Mauritanien de Recherches Océanographiques et des Pêches, Nouadhibou, Mauritania Africa Requires data request Beyah Meissa Inconsistent sampling through space and time
NAM Namibia Namibia National Marine Information and Research Centre, Ministry of Fisheries and Marine Resources, Namibia Africa Requires data request Johannes Kathena Included
NEUS-Fall NE US Fall Northeast USA Fall National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
NEUS-Spring NE US Spring Northeast USA Spring National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
NIGFS-1 N Ireland Q1 North Ireland Quarter 1 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
NIGFS-4 N Ireland Q4 North Ireland Quarter 4 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
Nor-BTS-3 Barents Sea Norway Q3 Barents Sea Norway Q3 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
NS-IBTS-1 N Sea Q1 North Sea Quarter 1 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
NS-IBTS-3 N Sea Q3 North Sea Quarter 3 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
NZ-CHAT Chatham Rise NZ Chatham Rise New Zealand National Institute of Water and Atmospheric Research Limited, New Zealand Oceania Requires data request Richard O’Driscoll and Fabrice Stephenson Included
NZ-ECSI E Coast S Island NZ East Coast South Island New Zealand National Institute of Water and Atmospheric Research Limited, New Zealand Oceania Requires data request Richard O’Driscoll and Fabrice Stephenson Included
NZ-SUBA Sub-Antarctic NZ Sub-Antarctic New Zealand National Institute of Water and Atmospheric Research Limited, New Zealand Oceania Requires data request Richard O’Driscoll and Fabrice Stephenson Included
NZ-WCSI W Coast S Island NZ West Coast South Island New Zealand National Institute of Water and Atmospheric Research Limited, New Zealand Oceania Requires data request Richard O’Driscoll and Fabrice Stephenson Included
PT-IBTS Portugal Portugal International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
ROCKALL Rockall Plateau Rockall Plateau International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
S-GEORG S Georgia South Georgia British Antarctic Survey Southern Ocean Requires data request Mark Belchier and Martin Collins Included
SCS-Fall Scotian Shelf Fall Scotian Shelf Summer Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/1366e1f1-e2c8-4905-89ae-e10f1be0a164 and OceanAdapt: https://zenodo.org/records/8103080 Too few years
SCS-SPRING Scotian Shelf Spring Scotian Shelf Spring Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/fecf045a-95a2-4b69-8a40-818649a62716 and OceanAdapt: https://zenodo.org/records/8103080 Too much data loss after spatial temporal standardization
SCS-SUMMER Scotian Shelf Summer Scotian Shelf Summer Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/1366e1f1-e2c8-4905-89ae-e10f1be0a164 and OceanAdapt: https://zenodo.org/records/8103080 Included
SEUS-fall SE US Fall Southeast USA Fall National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
SEUS-spring SE US Spring Southeast USA Spring National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
SEUS-summer SE US Summer Southeast USA Summer National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
SWC-IBTS-1 Scotland Shelf Sea Q1 Scotland Shelf Sea Quarter 1 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
SWC-IBTS-4 Scotland Shelf Sea Q4 Scotland Shelf Sea Quarter 4 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
WBLS Western Black Sea Western Black Sea Institute of Fish Resources, Bulgaria Europe Requires data request Elitsa Petrova (), Feriha Tserkova & Vesselina Mihneva Too few years
WCANN W Coast US West Coast USA National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
ZAF-ATL Atlantic Ocean ZA Atlantic Ocean South Africa Department of Forestry, Fisheries and the Environment, South Africa Africa Requires data request Tracey Fairweather Included
ZAF-IND Indian Ocean ZA Indian Ocean South Africa Department of Forestry, Fisheries and the Environment, South Africa Africa Requires data request Tracey Fairweather Included

FishGlob_1.5 <- fread(here::here("data","FISHGLOB_v1.5_clean.csv"))
|--------------------------------------------------|
|==================================================|
|--------------------------------------------------|
|==================================================|

This version of FishGlob leaves out seasons for GMEX, fix here

#add season to GMEX to survey unit

FishGlob_1.5[survey == "GMEX", survey_unit := paste0(survey,"-",season)]

Also adding in seasons for NIGFS

#add season to GMEX to survey unit

FishGlob_1.5[survey == "NIGFS", survey_unit := paste0(survey,"-",quarter)]

ZAF (South Africa) has distinct Atlantic and Indian surveys (split at ~20.01˚ E, Cape Agulhas)

FishGlob_1.5[survey == "ZAF" & longitude <20.01, survey_unit := "ZAF-ATL"][survey == "ZAF" & longitude >= 20.01, survey_unit := "ZAF-IND"]

Region names

sort(unique(FishGlob_1.5[,survey_unit]))
<<<<<<< HEAD
 [1] "AI"          "BITS-1"      "BITS-4"      "CHL"         "COL"         "DFO-HS"      "DFO-NF"      "DFO-QCS"     "DFO-SOG"     "DFO-WCHG"    "DFO-WCVI"    "EBS"        
[13] "EVHOE"       "FALK"        "FR-CGFS"     "GIN"         "GMEX-Fall"   "GMEX-Summer" "GOA"         "GRL-DE"      "GSL-N"       "GSL-S"       "ICE-GFS"     "IE-IGFS"    
[25] "IS-MOAG"     "IS-TAU"      "MEDITS"      "MRT"         "NAM"         "NEUS-Fall"   "NEUS-Spring" "NIGFS-1"     "NIGFS-4"     "Nor-BTS"     "NS-IBTS-1"   "NS-IBTS-3"  
[37] "NZ-CHAT"     "NZ-ECSI"     "NZ-SUBA"     "NZ-WCSI"     "PT-IBTS"     "ROCKALL"     "S-GEORG"     "SCS-FALL"    "SCS-SPRING"  "SCS-SUMMER"  "SEUS-fall"   "SEUS-spring"
[49] "SEUS-summer" "SWC-IBTS-1"  "SWC-IBTS-4"  "WBLS"        "WCANN"       "WCTRI"       "ZAF"         "ZAF-ATL"     "ZAF-IND"    
=======
 [1] "AI"          "BITS-1"      "BITS-4"      "CHL"         "COL"         "DFO-HS"      "DFO-NF"      "DFO-QCS"     "DFO-SOG"     "DFO-WCHG"    "DFO-WCVI"    "EBS"         "EVHOE"       "FALK"       
[15] "FR-CGFS"     "GIN"         "GMEX-Fall"   "GMEX-Summer" "GOA"         "GRL-DE"      "GSL-N"       "GSL-S"       "ICE-GFS"     "IE-IGFS"     "IS-MOAG"     "IS-TAU"      "MEDITS"      "MRT"        
[29] norway_clean "NEUS-Fall"   "NEUS-Spring" "NIGFS-1"     "NIGFS-4"     "Nor-BTS"     "NS-IBTS-1"   "NS-IBTS-3"   "NZ-CHAT"     "NZ-ECSI"     "NZ-SUBA"     "NZ-WCSI"     "PT-IBTS"     "ROCKALL"    
[43] "S-GEORG"     "SCS-FALL"    "SCS-SPRING"  "SCS-SUMMER"  "SEUS-fall"   "SEUS-spring" "SEUS-summer" "SWC-IBTS-1"  "SWC-IBTS-4"  "WBLS"        "WCANN"       "WCTRI"       "ZAF"         "ZAF-ATL"    
[57] "ZAF-IND"    
>>>>>>> 8d88acff98c502edab8abae4316aaab0dece37b7

##Data Replacements ####Greenland (version in FishGlob 1.5 is missing lengths and therefore biomass values) This version was obtained directly from Karl-Michael Werner karl-michael.werner@thuenen.de who now manages the Greenland survey September 2023. He is based in Germany.

#greenland <- 

####Norway Prepped by Laurene Pecuchet (U Trƶmso, Norway) September 2023 to replace what’s in FishGlob 1.5 because IMR ā€œare quite concerned that FishGlob, and other studies, have been using aā€flawedā€ multi-surveys dataset that is available in NMDC (data portal of IMR). Turns out that this dataset was put publicly by miscommunication on NMDC after one published paper in Scientific Reports, and I think they only realized the existence of this dataset just the last year as some papers are coming out using it (especially the one from Cesc Gordo-Vilaseca in PNAS https://www.pnas.org/doi/10.1073/pnas.2120869120). They are now trying to make some damage controls to make sure that this dataset is not used ever again in the future, but that cleanded and standardised datasets of the Barents Sea survey that are publicly available in NMDC are used instead of.

September 14: From Laurene, ā€œI send you in attachment the ā€œnewā€ IMR survey formatted for Fishglob. I have done some small check of the dataset, and so far everything looks good, but I didn’t do a deep check yet, but I don’t see why there should be any problems with it….For your study, I think it is also important that you know that there has been some inconsistencies in taxonomic descriptions in the Barents Sea so that some species should be considered at the genus level instead of for biodiversity analysis, I send you in attach an excel (Barents Sea Fish Reference List.csv) file that summarize which species might be a misidentification and which one should be considered and merged.ā€ All of these files now live in ā€œdata/Norway_Sep2023ā€

Helpful guidance from here: https://www.hi.no/en/hi/nettrapporter/rapport-fra-havforskningen-en-2021-15 - ā€œ2.2.5 - Recommended adjustments to the output before analysis Eelpouts and liparids. When combing years, we recommend that all records of eelpouts (Zoarcidae) are pooled to the family level, because they are notoriously difficult to identify (see Appendix 3). The same apply to liparids (Liparidae). If species level data of these families are used, consider excluding data from 2004-2006/2007. These years the staff on some of the Norwegian vessels were inexperienced, and proper identification keys for arctic species were lacking (compare for instance catches of Lycodes frigidus and Lycodes eudipleurostictus in the first years to the later years, Appendix 3). If species level data of these families are used, records to family levels should be removed or else these will be treated as a separate species in the further analysis of the data. Both Zoarcidae and Liparidae have unresolved taxonomy for some genera, therefore we have chosen to pool all liparids of the genus Careproctus and all eelpouts of the genus Gymnelus in the output. Sebastes. The columnā€ Sebastes spp.ā€ contains mainly juvenile redfish. Small specimens are very difficult to identify so the protocol is to identify only individuals larger than 10 cm to the species level. Before analysis, all redfish ( S . mentella , S. norvegicus, S. viviparus and Sebastes spp .) should be pooled, or Sebastes spp. should be removed – if not it will be treated as a separate species in the analysis . Records in Appendix 2. The records of the S. viviparus west of Svalbard(Spitsbergen) are unreliable and should be removed if Sebastes data are kept at the species level (Appendix 2). Species verified for the Barents Sea, but outliers in terms the normal depth range, distribution area within the Barents Sea, size etc. were coded as questionable in the data base (Appendix 2) and should be removed before analysis. Consider also removing pelagic species (e.g.Ā capelin and herring), as these are poorly sampled by the bottom trawl. The data should be standardised with towing distance before analysis.ā€

Therefore, we will: - Remove all records of eelpouts and liparids (Family = Zoarcidae or Liparidae) (as we only include species ID’d to species) - Remove redfish (Genus = Sebastes)


#load Norwegian data
load(here::here("data","Norway_Sep2023","NOR-BTS_clean.RData"))
norway_clean <- data.table(data)

#remove observations without dates
norway_clean <- norway_clean[complete.cases(norway_clean[,.(month)]),]

#remove species records in accordance with recommendation from HI
norway_clean <- norway_clean[!(family %in% c("Zoarcidae","Liparidae") | genus == "Sebastes"),]

#some column names don't match fishglob (fishglob = num, num_h, num_cpue, wgt, wgt_h, wgt_cpue; norway = num, num_cpue (number of ind./hour), num_cpua (number of ind./km2), wgt, wgt_cpue (kg/min), wgt_cpua(kg/km2)  )
#also, some column units in the readme are in correct. Therefore, I will generate _cpue and _h values here
# we will need to check  and rename columns
setnames(norway_clean, c("haul_dur"), c("haul_dur_m"))
norway_clean[,haul_dur := haul_dur_m/60] #haul duration currently in minutes, need hours
norway_clean[,num_h := num/haul_dur][,num_cpue := num/area_swept][,wgt_h := wgt/haul_dur][,wgt_cpue := wgt/area_swept]

#change some columns to numeric
cols = c("month","day")
norway_clean[,(cols) := lapply(.SD,as.numeric),.SDcols = cols]

#also, delete source and timestamp
fishglob_colnames <- colnames(FishGlob_1.5)
norway_clean <- norway_clean[,..fishglob_colnames]

norway_clean[survey == "Nor-BTS" & month %in% c(1:6), survey_unit := "Nor-BTS-1"][survey == "Nor-BTS" & month %in% c(7:12), survey_unit := "Nor-BTS-3"]

#Overlap between IBTS and Nor-BTS surveys below 62˚latitude, so delete all hauls that occur below 62˚latitude
norway_clean <- norway_clean[latitude  >= 62,]

Delete Greenland and Norway

FishGlob_1.5 <- FishGlob_1.5[!(survey %in% c("Nor-BTS"
                                             #,
                                             #"GRL-DE" #ignore greenland for now...
                                             ))]

Add in updated Greenland and Norway data

FishGlob_1.5 <-rbind(FishGlob_1.5,norway_clean)
#FishGlob_1.5 <-rbind(FishGlob_1.5,greenland)

##Preliminary Data Cuts ###Specific Regional Changes Before Cutting to 10 years only

GSL - North: we have data 1980-2019, but gear changes in 2004/2005, so let’s use later portion (more consistent months of sampling; 2005-2019; 15 years) - South: we have data 1970-2019, but gear/vessel changes in 1985 and again in 1992, so again let’s use later portion (1992-2019; 27 years) - See this github issue

#identify haul_ids of hauls we should remove from GSL surveys
haul_ids_to_remove_GSL <- unique(FishGlob_1.5[(survey == "GSL-N" & year < 2005)|(survey == "GSL-S" & year < 1992),haul_id])

FishGlob_1.5 <- FishGlob_1.5[!(haul_id %in% haul_ids_to_remove_GSL),] #remove hauls before consistent gear/vessel was used

SGEORG - From Martin Collins, ā€œMost surveys were focused on demersal fish on the South Georgia shelf (< 350 m), but surveys in 2003, 2010 and 2019 had some deeper trawls. The deeper trawls caught very different fish, so are unlikely to be of use to a long-term analysis, but I have left them in.ā€

-Delete all trawls deeper than 350 M

<<<<<<< HEAD
haul_ids_to_remove_SGEORG <- unique(FishGlob_1.5[(survey == "SGEORG" & depth >350),haul_id])
=======

#identify haul_ids of hauls we should remove from GSL surveys
haul_ids_to_remove_SGEORG <- unique(FishGlob_1.5[(survey == "SGEORG" & depth >350),haul_id])
>>>>>>> 8d88acff98c502edab8abae4316aaab0dece37b7

FishGlob_1.5 <- FishGlob_1.5[!(haul_id %in% haul_ids_to_remove_SGEORG),] #remove hauls before consistent gear/vessel was used

NZ-CHAT -bump december observations to next year because observations occur in 12,1,2

#bump observations forward
FishGlob_1.5[survey == "NZ-CHAT" & month == 12,  year := year+1, ]

###Because time is an essential component of these analyses, we will get rid of any survey x season combinations that are not sampled for at least 10 years

#new row for total number of years sampled
FishGlob_1.5[,years_sampled := length(unique(year)),.(survey_unit)]

summary(FishGlob_1.5$years_sampled) #ranges from 2 (DFO Straight of Georgia) to 57 (Northeast US)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00   23.00   29.00   30.89   37.00   57.00 
View(unique(FishGlob_1.5[,.(survey_unit, years_sampled)]))

#statistics about full dataset
nrow(FishGlob_1.5) 
[1] 4172996
length(unique(FishGlob_1.5[,survey])) 
[1] 45
length(unique(FishGlob_1.5[,survey_unit])) 
[1] 57
#remove observations for any regions x season combinations sampled less than 10 times
FishGlob.10year <- FishGlob_1.5[years_sampled >= 10,]

#statistics about reduced 10 year dataset
nrow(FishGlob.10year) 
[1] 4089112
length(unique(FishGlob.10year[,survey])) 
[1] 38
length(unique(FishGlob.10year[,as.character(survey_unit)])) 
[1] 48
#remove full database
rm(FishGlob_1.5)

###For taxonomic analyses, resolution to species is required. Therefore, we will exclude any observations not resolved to species.

#month a number
FishGlob.10year[,month := as.numeric(month)]

FishGlob.10year.spp <- FishGlob.10year[rank %in% c("Species", "Subspecies"),] #3869384 total observations

#remove full species database
rm(FishGlob.10year)

#vector with all survey names
all_survey_units <- sort(unique(FishGlob.10year.spp[,survey_unit]))

#calculate # species per year
FishGlob.10year.spp_survey_year <- unique(FishGlob.10year.spp[,.(survey_unit, year, accepted_name)])

FishGlob.10year.spp_survey_year[,spp_count_survey_year := uniqueN(accepted_name),.(survey_unit, year)]

FishGlob.10year.spp_survey_year.r <-unique(FishGlob.10year.spp_survey_year[,.(survey_unit,  year, spp_count_survey_year)])

nrow(FishGlob.10year.spp_survey_year.r)
[1] 1215
#calculate # hauls per year
FishGlob.10year.spp_haulid_year <- unique(FishGlob.10year.spp[,.(survey_unit, year, haul_id)])

FishGlob.10year.spp_haulid_year[,haulid_count_survey_year := uniqueN(haul_id),.(survey_unit, year)]

FishGlob.10year.spp_haulid_year.r <-unique(FishGlob.10year.spp_haulid_year[,.(survey_unit,  year, haulid_count_survey_year)])

nrow(FishGlob.10year.spp_haulid_year.r)
[1] 1215

##Visually Inspect Distribution of Data Through Time and Space

##Spatial and Temporal Patterns in All Trawl Surveys

Let’s look at the number of hauls per year/month and year/quarter and year/season visually

#unique survey, survey_unit, year, month, quarter, season, haul_id, lat, lon
FishGlob.10year.uniquehauls <- unique(FishGlob.10year.spp[,.(survey, survey_unit, year,month,quarter,season,haul_id, latitude, longitude,haul_dur)])

#add column with adjusted longitude for few surveys that cross dateline (NZ-CHAT and AI)
FishGlob.10year.uniquehauls[,longitude_adj := ifelse((survey_unit %in% c("AI","NZ-CHAT") & longitude > 0),longitude-360,longitude)]

FishGlob.10year.uniquehauls[,haul_counts_per_survey_season_month :=uniqueN(haul_id),.(survey, month, season)][, #count # hauls per survey, season, and month
                     haul_counts_per_survey_quarter_month :=uniqueN(haul_id),.(survey, month, quarter)][,#count # hauls per survey, month, and quarter
                     total_hauls_survey :=uniqueN(haul_id),.(survey)][,#count # hauls per survey in all years
                                                        
              #proportion of hauls for each survey, season, and month divided by total # over all years
                     haul_proportion_survey_season :=haul_counts_per_survey_season_month/total_hauls_survey][,
              #proportion of hauls for each survey, quarter, and month divided by total # over all years
                     haul_proportion_survey_quarter :=haul_counts_per_survey_quarter_month/total_hauls_survey][,
                                                                                                               
                     haul_count_per_survey_year_month :=uniqueN(haul_id),.(year, survey_unit, month)][, #count # hauls per survey unit, year, and month
                     total_hauls_survey_year := uniqueN(haul_id),.(survey_unit,year)][, #count total # hauls per survey unit and year
                     #proportion of hauls for each survey unit and month divided by total # hauls within a survey unit within a year
                     haul_proportion_month_yearly := haul_count_per_survey_year_month/total_hauls_survey_year][, 

                     haul_count_per_survey_year_quarter :=uniqueN(haul_id),.(year, survey_unit, quarter)][, #count # hauls per survey unit, year, and month
                     #proportion of hauls for each survey unit and month divided by total # hauls within a survey unit within a year
                     haul_proportion_quarter_yearly := haul_count_per_survey_year_quarter/total_hauls_survey_year] 

FishGlob.10year.uniquehauls.season <- unique(FishGlob.10year.uniquehauls[,.(survey, survey_unit, month, season, haul_counts_per_survey_season_month,total_hauls_survey, haul_proportion_survey_season)]) #relative sampling by season across all years

FishGlob.10year.uniquehauls.quarter <- unique(FishGlob.10year.uniquehauls[,.(survey,survey_unit , month, quarter, haul_counts_per_survey_quarter_month,total_hauls_survey, haul_proportion_survey_quarter)]) #relative sampling by quarter across all years

FishGlob.10year.uniquehauls.annual.month <- unique(FishGlob.10year.uniquehauls[,.(survey, year, survey_unit, month, haul_count_per_survey_year_month,total_hauls_survey_year,haul_proportion_month_yearly)]) #relative sampling by month within years

FishGlob.10year.uniquehauls.annual.quarter <- unique(FishGlob.10year.uniquehauls[,.(survey, year, survey_unit, quarter, haul_count_per_survey_year_quarter,total_hauls_survey_year,haul_proportion_quarter_yearly)]) #relative sampling by month within years

#how does #hauls vary with season and month?
survey_season_month_hauls <- ggplot(FishGlob.10year.uniquehauls.season) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  facet_wrap(~survey,scales = "free_y") +
  theme_classic()

ggsave(survey_season_month_hauls, filename = "survey_season_month_hauls.pdf",path = here::here("figures","view_data"), height = 5, width = 15, units = "in")

#how does #hauls vary with quarter and month?
survey_quarter_month_hauls <- ggplot(FishGlob.10year.uniquehauls.quarter) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  facet_wrap(~survey,scales = "free_y") +
  theme_classic()

ggsave(survey_quarter_month_hauls, filename = "survey_quarter_month_hauls.pdf",path = here::here("figures","view_data"), height = 5, width = 15, units = "in")

#how does #hauls vary with year and month?
year_survey_month_hauls <- ggplot(FishGlob.10year.uniquehauls.annual.month) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  facet_wrap(~survey_unit,scales = "free_y") +
  theme_classic()

ggsave(year_survey_month_hauls, filename = "year_survey_month_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")
ggsave(year_survey_month_hauls, filename = "year_survey_month_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")

#how does #hauls vary with year and month?
year_survey_quarter_hauls <- ggplot(FishGlob.10year.uniquehauls.annual.quarter) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  facet_wrap(~survey_unit,scales = "free_y") +
  theme_classic()

ggsave(year_survey_quarter_hauls, filename = "year_survey_quarter_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")
ggsave(year_survey_quarter_hauls, filename = "year_survey_quarter_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")

Now, let’s look at how location of sampling varies by month of sampling and year of sampling

location_by_year <- ggplot(FishGlob.10year.uniquehauls) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  facet_wrap(~survey_unit, scales = "free") +
  theme_classic()

ggsave(location_by_year, filename = "location_by_year.pdf",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_year, filename = "location_by_year.jpg",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_year, filename = "location_by_year.eps",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")
(location_by_month <- ggplot(FishGlob.10year.uniquehauls) +
  geom_point(aes(x = longitude_adj, y = latitude, color = as.numeric(month)), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  facet_wrap(~survey_unit, scales = "free") +
  theme_classic())

ggsave(location_by_month, filename = "location_by_month.pdf",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_month, filename = "location_by_month.jpg",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_month, filename = "location_by_month.eps",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

<<<<<<< HEAD

======= >>>>>>> 8d88acff98c502edab8abae4316aaab0dece37b7

##Region Specific Data Processing

-Fredston et al.Ā 2022 Nature and Batt et al.Ā 2017 Ecology Letters informed North American data processing -Personal communication with Aurore Maureaud and Laurene Pecuchet re: work by A. Maureaud, L. Pecuchet and R. Frelat and the supplementary material for Maureaud et al.Ā 2019 Proceedings of the Royal Society B: Biological Sciences informed European data processing -Additional data processing informed by data itself, and by FishGlob pdf summary documents -limit to max 3 months for each survey unit, representative of a ā€˜season’ (exception = West Coast USA where all 4 months sampled consistently)

####ā€œAIā€

ggplot(FishGlob.10year.uniquehauls.season[survey == "AI",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey == "AI",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey == "AI",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey == "AI",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey == "AI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey == "AI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "AI",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "AI",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

  • Most hauls in 6,7,8
  • Seemingly consistent spatial distribution through time
  • No dramatic changes in spp richness
ai_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "AI" & month %in% c(6:8),haul_id])

####BITS (We have two surveys for BITS, quarter 1 and quarter 4) BITS 1

From Fredston et al.Ā 2023, every year after 2000 has >400 hauls and most of the earlier years are <50

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "BITS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "BITS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep both months (2,3) -Seemingly consistent spatial distribution through time -Consistent # of species and # hauls after 2000

bits1_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "BITS-1" & month %in% c(2,3) & year > 2000,haul_id])

BITS4

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "BITS-4",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "BITS-4",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (10,11,12) -Start in 2000 (starts in 1996, but gap in 1997 and 1998, and 1996 all in December; also spp richness in first survey very low; consistent # of hauls after 2000) -Seemingly consistent spatial distribution through time

bits4_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "BITS-4" & month %in% c(10:12) & year > 2000,haul_id])

####CHL (Chile)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "CHL",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "CHL",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "CHL",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "CHL",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "CHL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "CHL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "CHL",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "CHL",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (7,8,9) -Seemingly consistent spatial distribution through time -No major changes in spp richness through time -No major changes in # hauls through time

chl_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "CHL" & month %in% c(7:9),haul_id])

####DFO-NF

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "DFO-NF",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "DFO-NF",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (10,11,12) -Seemingly consistent spatial distribution through time -No major changes in spp richness through time -No major changes in haulid through time

dfo_nf_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF" & month %in% c(10:12),haul_id])

####DFO-QCS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "DFO-QCS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "DFO-QCS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (7,8) -Seemingly consistent spatial distribution through time -No major changes in richness over time -No major changes in #hauls

dfo_qcs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS" & month %in% c(7,8),haul_id])

####EBS

-Sampling years prior to 1984 (data begin in 1982) were excluded from analysis due to large apparent increases in the number of species recorded in the first two years. (Batt et al.Ā 2017)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "EBS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "EBS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "EBS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "EBS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EBS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EBS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "EBS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "EBS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (6,7,8) -Seemingly consistent spatial distribution through time -Per Batt et al.Ā 2017, limit to >= 1984 -No clear changes in richness through time -No clear changes in # hauls through time

ebs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "EBS" & month %in% c(6,7,8) & year >= 1984,haul_id])

####EVHOE

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EVHOE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EVHOE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "EVHOE",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "EVHOE",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (10,11,12) -Seemingly consistent spatial distribution through time -Very low sampling in 2017 (and also low richness), exclude this year

evhoe_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "EVHOE" & month %in% c(10,11,12) & year != 2017 ,haul_id])

####FALK (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "FALK",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "FALK",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "FALK",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "FALK",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FALK",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FALK",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "FALK",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "FALK",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep February (2) only from 2004 onward (most consistent sampling) -Inconsistent spatial distribution through time, but this will be fixed in next step with spatial standardization

falk_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "FALK" & month %in% c(2) & year >= 2004, haul_id])

####FR-CGFS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "FR-CGFS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "FR-CGFS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 9,10,11 -Consistent spatial distribution through time -Seemingly consistent richness through time -Seeemingly consistent #hauls through time

fr_cgfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS" & month %in% c(9,10,11), haul_id])

####GIN (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GIN",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GIN",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GIN",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GIN",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GIN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GIN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GIN",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GIN",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Exclude this region, no consistent sampling through time

gin_hauls_keep <- NULL

####GMEX -In the Gulf of Mexico, we restricted our analysis to data from 1984 - 2000 (full range 1982-2014); if all years had been used, the number of sites sampled in at least 85% of years would drop from 39 to 13. (Batt et al.Ā 2017)

GMEX Fall

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GMEX-Fall",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GMEX-Fall",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 9,10,11 -Inconsistent spatial distribution through time, will restrict to <-87.5 longitude -Seemingly consistent richness through time -Seeemingly consistent #hauls through time

gmex_fall_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall" & month %in% c(9,10,11) & longitude_adj < -87.5, haul_id])

GMEX Summer

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GMEX-Summer",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GMEX-Summer",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep months 5,6,7 -In consistent spatial distribution through time, but this will be fixed in spatial standardization step -Seemingly consistent richness before 2008 and 2008 onward through time -Seeemingly consistent #hauls through time -Jump from 2007 to 2008, when spatial footprint increases, so I will only use data from before 2008

gmex_summer_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer" & month %in% c(5,6,7) & year <2008, haul_id])

####GOA

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GOA",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GOA",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GOA",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GOA",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GOA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GOA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GOA",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GOA",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep months 6,7,8 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent #hauls through time

goa_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GOA" & month %in% c(6,7,8), haul_id])

####GRL-DE -From Beukhof et al.Ā 2019, all surveys in October and November

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GRL-DE",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GRL-DE",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-No months in data set, but according to Beukhof et al.Ā 2019, all sampling in October and November so keep all -Consistent spatial distribution through time -Seemingly consistent richness -# of hauls drops between 1991 and 1992, and both 1992 and 2017 so limit to years between (1993-2016)

grl_de_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE" & year %in% c(1993:2016), haul_id])

####GSL

GSL-N

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-N",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-N",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GSL-N",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GSL-N",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 6,7,8 -Consistent spatial distribution through time -Seemingly consistent richness -# of hauls in 2005 is higher, so start in 2006

gsl_n_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GSL-N" & year > 2005, haul_id])

GSL-S

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-S",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-S",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GSL-S",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GSL-S",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 8,9,10 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

gsl_s_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GSL-S" & month %in% c(8:10), haul_id])

####ICE-GFS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ICE-GFS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ICE-GFS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 2,3,4 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

ice_gfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS" & month %in% c(2:4), haul_id])

####IE-IGFS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "IE-IGFS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "IE-IGFS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 10,11,12 -Consistent spatial distribution through time after 2004 (sampled far east in 2003 and 2004) -Seemingly consistent richness -Seemingly consistent number of hauls

ie_igfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS" & month %in% c(10:12) & year  > 2004, haul_id])

####IS-MOAG (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IS-MOAG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IS-MOAG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "IS-MOAG",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "IS-MOAG",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Sampling too scattered over time, excluding

is_moag_hauls_keep <- NULL

####MEDITS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MEDITS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MEDITS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "MEDITS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "MEDITS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep all surveys in quarter 2 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

medits_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "MEDITS", haul_id])

####MRT (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "MRT",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "MRT",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "MRT",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "MRT",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MRT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MRT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "MRT",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "MRT",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Sampling inconsistent, exclude completely

mrt_hauls_keep <- NULL

####NAM

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NAM",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NAM",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NAM",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NAM",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NAM",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NAM",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NAM",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NAM",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep surveys in 1 and 2 (most consistently sampled) -Consistent spatial distribution through time -Seemingly consistent richness except for 1998 (exclude) -Seemingly consistent number of hauls except for 1998 (exclude)

nam_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NAM" & month %in% c(1,2) & year != 1998, haul_id])

####NEUS

NEUS Spring

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NEUS-Spring",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NEUS-Spring",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 3,4,5 months -Inconsistent spatial distribution through time, but should be caught in standardization step -Seemingly consistent richness (especially after 87, should be fixed with standardization step) -Seemingly consistent number of hauls (especially after 81, should be fixed with standardization step)

#calculate wgt_cpue (km^2 avg from sean Lucey) and wgt_h (all biomass values calibrated to standard pre 2009 30 minute tow)
FishGlob.10year.spp[survey == "NEUS", wgt_h := wgt/0.5][survey == "NEUS", wgt_cpue := wgt/0.0384][survey == "NEUS", num_h := num/0.5][survey == "NEUS", num_cpue := num/0.0384]


#also, for northeast, we are going to delete any hauls before 2009 that are outside of +/- 5 minutes of 30 minutes and 2009 forward that are outside of +/- 5 minutes of 20 minutes
neus_spring_keep <- unique(FishGlob.10year.uniquehauls[((survey_unit == "NEUS-Spring" & month %in% c(3:5) & year < 2009 & (haul_dur > 0.42 & haul_dur < 0.58)) |
                                                        (survey_unit == "NEUS-Spring" & month %in% c(3:5) & year >= 2009 & (haul_dur > 0.25  & haul_dur < 0.42))), haul_id])

NEUS Fall

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NEUS-Fall",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NEUS-Fall",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 9,10,11 months -Inconsistent spatial distribution through time, but should be caught in standardization step -Seemingly consistent richness (especially after 84, should be fixed with standardization step) -Seemingly consistent number of hauls (especially after 85, should be fixed with standardization step)


#also, for northeast, we are going to delete any hauls before 2009 that are outside of +/- 5 minutes of 30 minutes and 2009 forward that are outside of +/- 5 minutes of 20 minutes
neus_fall_keep <- unique(FishGlob.10year.uniquehauls[((survey_unit == "NEUS-Fall" & month %in% c(9,10,11) & year < 2009 & (haul_dur > 0.42 & haul_dur < 0.58)) |
                                                        (survey_unit == "NEUS-Fall" & month %in% c(9,10,11) & year >= 2009 & (haul_dur > 0.25  & haul_dur < 0.42))), haul_id])

####NIGFS Northern Ireland

Spring Northern Ireland (quarter 1)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NIGFS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NIGFS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 2,3,4 months -Inconsistent spatial distribution through time, but should be caught in standardization step -Seemingly consistent richness -Seemingly consistent number of hauls

nigfs_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1" & month %in% c(2,3,4), haul_id])

Spring Northern Ireland (quarter 1)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NIGFS-4",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NIGFS-4",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 10,11 months -Consistent spatial distribution through time, but should be caught in standardization step -Seemingly consistent richness -Seemingly consistent number of hauls

nigfs_4_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4" & month %in% c(10,11), haul_id])

####Nor-BTS

OG FISHGLOB includes Nor-BTS-1 as well, but this was not shared by L. Pecuchet, and therefore ignored

Nor-BTS-3

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "Nor-BTS-3",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "Nor-BTS-3",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 8,9,10 -Somewhat consistent spatial distribution through time -Number of hauls is variable, but no clear years to exclude -Laurene Pecuchet (U Tromso) told us that only surveys 2004 and onwards work for biodiversity analyses

nor_bts_3_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3" & month %in% c(8:10) & year >= 2004, haul_id])

####NS-IBTS

NS-IBTS-1

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NS-IBTS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NS-IBTS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 1,2,3 -Consistent spatial distribution through time -Linear increase in richness, cutoff on # hauls more clear -Linear increase, but somewhat clear break between late 70s and mid-80s, only keep hauls after 1984

ns_ibts_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1" & month %in% c(1:3) & year >= 1984, haul_id])

NS-IBTS-3

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NS-IBTS-3",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NS-IBTS-3",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 7,8,9 -Consistent spatial distribution through time -Consistent richness through time -Early years lower # hauls, will start at 1998

ns_ibts_3_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3" & month %in% c(7:9) & year >= 1998, haul_id])

####NZ

NZ-CHAT

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()
<<<<<<< HEAD

=======

>>>>>>> 8d88acff98c502edab8abae4316aaab0dece37b7

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()
<<<<<<< HEAD

=======

>>>>>>> 8d88acff98c502edab8abae4316aaab0dece37b7

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()
<<<<<<< HEAD

=======

>>>>>>> 8d88acff98c502edab8abae4316aaab0dece37b7

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-CHAT",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-CHAT",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 12,1,2 (NOTE THAT THIS NZ-CHAT SURVEY CROSSES YEAR, SO WE ALREADY LUMPED 12 with NEXT year) -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls after 1995



nz_chat_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT" & month %in% c(12,1,2) & year >= 1995, haul_id])

NZ-ECSI

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-ECSI",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-ECSI",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 4,5,6 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls -Gap between 1995 and 2005, but we have 10 total years so we’ll keep for now

nz_ecsi_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI" & month %in% c(4,5,6), haul_id])

NZ-SUBA

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-SUBA",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-SUBA",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 11 and 12 -Consistent spatial distribution through time -Seemingly consistent richness -Far more hauls in 1990s, these early sampling years will be excluded (start in 2000)

nz_suba_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA" & month %in% c(11,12) & year >= 2000, haul_id])

NZ-WCSI

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-WCSI",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-WCSI",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 3,4 -Consistent spatial distribution through time -Seemingly consistent richness -Linear decrease in # of hauls through time, leave out first two years with highest # hauls (>= 1995)

nz_wcsi_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI" & month %in% c(3,4) & year >= 1995, haul_id])

####PT-IBTS PT-IBTS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "PT-IBTS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "PT-IBTS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 9,10,11 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

pt_ibts_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS" & month %in% c(9,10,11), haul_id])

####ROCKALL

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ROCKALL",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ROCKALL",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 8,9 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

rockall_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL" & month %in% c(8,9), haul_id])

####S-GEORG

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "S-GEORG",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "S-GEORG",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 1 and 2 -Consistent spatial distribution through time -Seemingly consistent richness except for 2003, will be excluded -Seemingly consistent number of hauls, except for 2012, will be excluded

s_georg_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG" & month %in% c(1,2) & !(year %in% c(2003,2012)), haul_id])

####SCS

Spring

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SCS-SPRING",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SCS-SPRING",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 2,3,4 -Inconsistent spatial distribution through time (northern latitudes only sampled in early years), only include longitudes < -62 and latitudes < 45.5 -Seemingly consistent richness -Number of hauls is variable, exclude super low and high numbers (1985,1994,2015,2019)

scs_spring_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING" & month %in% c(2,3,4) & !(year %in% c(1985,1994,2015,2019)) & longitude_adj < -62 & latitude < 45.5, haul_id])

SUMMER

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SCS-SUMMER",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SCS-SUMMER",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 6,7,8 -Consistent spatial distribution through time -Richness increases linearly, not a clear break point, using breakpoint from # of hauls, but will exclude 2010 which has a very high richness -# Hauls increases linearly from ~120 in 1970 to ~220 in 2020, not a clear breakpoint, but will go with 1986 because there is a jump between 85 and 86 -Gear change in 1983 (Ellingsen et al.Ā 2015)

scs_summer_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER" & month %in% c(6,7,8) & year >= 1986 & year != 2010, haul_id])

###SEUS

Spring

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-spring",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-spring",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 4,5,6 -Consistent spatial distribution through time -Consistent richness through time -# Hauls low in 1989 and 2018, will exclude

seus_spring_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring" & month %in% c(4,5,6) & year != 1989 & year != 2018, haul_id])

Summer

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-summer",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-summer",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 7,8 -Consistent spatial distribution through time -Richness consistent through time -# Hauls low in first year, otherwise okay, just exclude first year (1989)

seus_summer_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer" & month %in% c(7,8) & year != 1989, haul_id])

Fall

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-fall",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-fall",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 9,10,11 -Consistent spatial distribution through time -Richness consistent through time -# Hauls low in first year, otherwise okay, just exclude first year (1989)

seus_fall_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall" & month %in% c(9,10,11) & year != 1989, haul_id])

####SWC-IBTS

Scotland Shelf Sea

SWC-IBTS 1

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SWC-IBTS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SWC-IBTS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 1,2,3 -Somewhat inconsistent spatial distribution through time, but this should be addressed in spatial standardization procedure -Richness consistent through time -# Hauls consistent except low in 1995, just exclude 1995

swc_ibts_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1" & month %in% c(1,2,3) & year != 1995, haul_id])

SWC-IBTS 4

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SWC-IBTS-4",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SWC-IBTS-4",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 10,11,12 -Somewhat inconsistent spatial distribution through time (southern latitudes only sampled in early years), but this should be addressed in spatial standardization procedure -Richness consistent through time (especially after mid 90s) -# Hauls consistent except low before 1995 and low in 2013, exclude these

swc_ibts_4_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4" & month %in% c(10,11,12) & year != 1995 & year >= 1995, haul_id])

####WCANN

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "WCANN",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "WCANN",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "WCANN",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "WCANN",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "WCANN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "WCANN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "WCANN",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "WCANN",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Here, one exception, will use four months (6,7,8,9) because all sampled consistently, and lower latitude areas sampled later in the summer consistently -Consistent spatial distribution through time -Richness consistent through time -# Hauls consistent through time

wcann_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "WCANN" & month %in% c(6:9), haul_id])

####WCTRI -Exclude because only 10 years and overlaps somewhat wiith WCANN

wctri_keep <- NULL

####ZAF

ATL

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ZAF-ATL",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ZAF-ATL",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Include 1,2,3 -Consistent spatial distribution through time -Richness consistent through time -# Hauls consistent through time after 1991

zaf_atl_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL" & month %in% c(1:3) & year >= 1991, haul_id])

IND

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ZAF-IND",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ZAF-IND",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Include 4,5,6 -Consistent spatial distribution through time -Richness consistent through time -# Hauls consistent before 2001, and then also in 2005 and 2009-2010

zaf_ind_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND" & month %in% c(4:6) & year %in% c(1985:2001,2005, 2009,2010), haul_id])

####Combine all lists that have _keep

#all objects with _keep
list_obj <- ls(pattern = "_keep")

#combine
fishglob_haulids_to_keep <- unlist(lapply(list_obj, get)) #229894 hauls (Started with 278405)

FishGlob.10year.spp_manualclean <- FishGlob.10year.spp[haul_id %in% fishglob_haulids_to_keep,]

#Require latitude and longitude for all observations
FishGlob.10year.spp_manualclean <- FishGlob.10year.spp_manualclean[complete.cases(FishGlob.10year.spp_manualclean[,.(latitude, longitude)])] #check that this works

#another check for # years sampled
#new row for total number of years sampled
FishGlob.10year.spp_manualclean[,years_sampled := length(unique(year)),.(survey_unit)]
View(unique(FishGlob.10year.spp_manualclean[,.(survey_unit, years_sampled)]))

#save
saveRDS(FishGlob.10year.spp_manualclean, file = here::here("data","cleaned","FishGlob.10year.spp_manualclean.rds"))

####Some surveys sample through end of year, fix these -NOTE THAT THIS NZ-CHAT SURVEY CROSSES YEAR, SO LUMP 1 and 2 with previous year

<<<<<<< HEAD
LS0tCnRpdGxlOiAiUHJlcGFyZSBGaXNoR2xvYiBEYXRhc2V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBab8OrIEouIEtpdGNoZWwKZGF0ZTogT2N0b2JlciAxMSwgMjAyMwotLS0KClNjcmlwdCAxIGZvciBLaXRjaGVsIGV0IGFsLiAyMDIzIGluIHByZXAgdGF4b25vbWljIGRpdmVyc2l0eSBtYW51c2NyaXB0LgoKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzcCkKbGlicmFyeShyYXN0ZXIpCiNsaWJyYXJ5KHJnZW9zKQpsaWJyYXJ5KHJnYmlmKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KHJhc3RlclZpcykKbGlicmFyeShjb25jYXZlbWFuKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoZGF0YS50YWJsZSkKc2V0LnNlZWQoMSkKCmBgYAoKUHVsbCBpbiBjb21waWxlZCBhbmQgY2xlYW5lZCBkYXRhIGZyb20gRmlzaEdsb2IgZG93bmxvYWRlZCBvbiBOb3ZlbWJlciAyOCAyMDIyIChWIDEuNSkuIFRoaXMgaXMgdHlwaWNhbGx5IGNvbXBpbGVkIGJ5IERyLiBBdXJvcmUgTWF1cmVhdWQuIFRoaXMgaW5jbHVkZXMgcHVibGljIGFuZCBwcml2YXRlIGRhdGEgYW5kIHRoZXJlZm9yZSBsaW5rIGNhbm5vdCBiZSBzaGFyZWQuIEhvd2V2ZXIgd2l0aCBlZGl0aW5nIHlvdSBjYW4gcnVuIGFuYWx5c2VzIGZvciBwdWJsaWMgdHJhd2wgc3VydmV5cy4KCnxTdXJ2ZXkgY29kZXxTdXJ2ZXkgbmFtZSBzaG9ydHxTdXJ2ZXkgbmFtZSBsb25nfEFnZW5jeXxSZWdpb258QWNjZXNzfFByb3ZpZGVyL2xpbmsgdG8gYWNjZXNzfEluY2x1c2lvbgp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfEFJICB8QWxldXRpYW4gSXNsYW5kc3xBbGV1dGlhbiBJc2xhbmRzfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8QklUUy0xICB8QmFsdGljIFNlYSBRMXxCYWx0aWMgU2VhIFF1YXJ0ZXIgMXxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxCSVRTLTQgIHxCYWx0aWMgU2VhIFE0fEJhbHRpYyBTZWEgUXVhcnRlciA0fEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfENITCAgfENoaWxlfENoaWxlfFVuaXZlcnNpZGFkIGRlIENvbmNlcGNpw7NuLCBDaGlsZXxTb3V0aCBBbWVyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxEYW5pZWxhIFllcHNvbiBkYW5pZWxhLnllcHNlbkBnbWFpbC5jb20gYW5kIEx1aXMgQ3ViaWxsb3MgbHVjdWJpbGxvc0BnbWFpbC5jb218SW5jbHVkZWR8CnxDT0x8IENvbG9tYmlhfCBDb2xvbWJpYW4gQ2FyaWJiZWFufFVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlIENvbG9tYmlhfFNvdXRoIEFtZXJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fENhbWlsbyBCLiBHYXJjaWEgY2JnYXJjaWFyQHVuYWwuZWR1LmNvfFRvbyBmZXcgeWVhcnN8CnxERk8tSFMgIHxIZWNhdGUgU3RyYWl0fEhlY2F0ZSBTdHJhaXR8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3xDYW5hZGF8UHVibGljfGh0dHBzOi8vb3Blbi5jYW5hZGEuY2EvZGF0YS9lbi9kYXRhc2V0Lzc4MGExYzAyLTFmOWMtNDk5NC1iYzcwLWEwZTllZjhlMzk2OCBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxUb28gZmV3IHllYXJzfAp8REZPLU5GICB8TmV3Zm91bmRsYW5kfE5ld2ZvdW5kbGFuZHxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfCBDYW5hZGF8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fE1hcmlhbm8gS29lbi1BbG9uc28gbWFyaWFuby5rb2VuLWFsb25zb0BkZm8tbXBvLmdjLmNhfEluY2x1ZGVkfAp8REZPLVFDUyAgfFF1ZWVuIENoYXJsb3R0ZSBTb3VuZHxRdWVlbiBDaGFybG90dGUgU291bmR8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3xDYW5hZGF8UHVibGljfGh0dHBzOi8vb3Blbi5jYW5hZGEuY2EvZGF0YS9lbi9kYXRhc2V0L2EyNzhkMWFmLWQ1NjctNDk2NC1hMTA5LWFlMWU4NGNiZDI0YSBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfERGTy1TT0cgIHxTdHJhaXQgb2YgR2VvcmdpYXxTdHJhaWdodCBvZiBHZW9yZ2lhfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC9kODgwYmExOC04NzkwLTQxYTItYmY3My1lOTI0NzM4MDc1OWIgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8IFRvbyBmZXcgeWVhcnN8CnxERk8tV0NIRyAgfFdlc3QgQ29hc3QgSGFpZGEgR3dhaWl8V2VzdCBDb2FzdCBIYWlkYSBHd2FpaXxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfENhbmFkYXxQdWJsaWN8aHR0cHM6Ly9vcGVuLmNhbmFkYS5jYS9kYXRhL2VuL2RhdGFzZXQvNWVlMzA3NTgtYjFkNi00OWZlLThjNGUtNTEzNmY0YjM5YWQxIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfCBUb28gZmV3IHllYXJzfAp8REZPLVdDVkkgIHxXZXN0IENvYXN0IFZhbmNvdXZlciBJc2xhbmR8V2VzdCBDb2FzdCBWYW5jb3V2ZXIgSXNsYW5kfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC81NTdlNDJhZS0wNmZlLTQyNmQtODI0Mi1jMzEwNzY3MGIxZGUgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8IFRvbyBmZXcgeWVhcnN8CnxFQlMgIHxFYXN0ZXJuIEJlcmluZyBTZWF8RWFzdGVybiBCZXJpbmcgU2VhfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8RVZIT0UgIHxCYXkgb2YgQmlzY2F5fEJheSBvZiBCaXNjYXl8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8RkFMSyAgfEZhbGtsYW5kIElzbGFuZHN8RmFsa2xhbmQgSXNsYW5kc3xGYWxrbGFuZCBJc2xhbmRzIEZpc2hlcmllcyBEZXBhcnRtZW50fFNvdXRoZXJuIE9jZWFufFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxBbGV4YW5kZXIgQXJraGlwa2luIGFhcmtoaXBraW5AZmlzaGVyaWVzLmdvdi5mayBhbmQgSm9yZ2UgUmFtb3MgamVyYW1vc0BmaXNoZXJpZXMuZ292LmZrfCBFeGNsdWRlZCBhZnRlciBzcGF0aWFsIHRlbXBvcmFsIHN0YW5kYXJkaXphdGlvbiBpbiBuZXh0IHNjcmlwdHwKfEZSLUNHRlMgIHxFbmdsaXNoIENoYW5uZWx8RW5nbGlzaCBDaGFubmVsfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfEdJTiAgfEd1aW5lYXxHdWluZWF8TmF0aW9uYWwgQ2VudGVyIG9mIEZpc2hlcmllcyBTY2llbmNlcyBvZiBCb3Vzc291cmEsIENvbmFrcnksIFJlcHVibGljIG9mIEd1aW5lYXxBZnJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fE1vaGFtbWVkIExhbWluZSBDYW1hcmEgbWxjYW1hcmEua2VubmVkeUBnbWFpbC5jb218SW5jb25zaXN0ZW50IHNhbXBsaW5nIHRocm91Z2ggc3BhY2UgYW5kIHRpbWV8CnxHTUVYLVN1bW1lciAgfEd1bGYgb2YgTWV4aWNvIFN1bW1lcnxHdWxmIG9mIE1leGljbyBTdW1tZXJ8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxHTUVYLUZhbGwgIHxHdWxmIG9mIE1leGljbyBGYWxsfEd1bGYgb2YgTWV4aWNvIEZhbGx8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxHT0EgIHxHdWxmIG9mIEFsYXNrYXxHdWxmIG9mIEFsYXNrYXxOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbnwgVVNBfFB1YmxpY3xEaXNNQVA6IGh0dHBzOi8vYXBwcy1zdC5maXNoZXJpZXMubm9hYS5nb3YvZGlzbWFwLyBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfEdSTC1ERSAgfEdyZWVubGFuZHxHcmVlbmxhbmR8VGh1ZW5lbiBJbnN0aXR1dGUgb2YgU2VhIEZpc2hlcmllc3xFdXJvcGV8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fEthcmwtTWljaGFlbCBXZXJuZXIga2FybC1taWNoYWVsLndlcm5lckB0aHVlbmVuLmRlfEluY2x1ZGVkfAp8R1NMLU4gIHxOIEd1bGYgb2YgU3QuIExhd3JlbmNlfE5vcnRoZXJuIEd1bGYgb2YgU3QuIExhd3JlbmNlfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xTZWUgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MCBmb3Igc3BlY2lmaWMgREZPIGxpbmtzfEluY2x1ZGVkfAp8R1NMLVMgIHxTIEd1bGYgb2YgU3QuIExhd3JlbmNlfFNvdXRoZXJuIEd1bGYgb2YgU3QuIExhd3JlbmNlfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC8xOTg5ZGUzMi1iYzVkLWM2OTYtODc5Yy01NGQ0MjI0MzhlNjQgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxJQ0UtR0ZTICB8SWNlbGFuZHxJY2VsYW5kfE1hcmluZSBhbmQgRnJlc2h3YXRlciBSZXNlYXJjaCBJbnN0aXR1dGUsIEljZWxhbmR8RXVyb3BlfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxKw7NuIFPDs2xtdW5kc3NvbiBqb24uc29sbXVuZHNzb25AaGFmb2d2YXRuLmlzfEluY2x1ZGVkfAp8SUUtSUdGUyAgfElyaXNoIFNlYXxJcmlzaCBTZWF8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8SVMtVEFVfCBJc3JhZWwgfCBJc3JhZWx8IFRlbCBBdml2IFVuaXZlcnNpdHl8QXNpYXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8IEpvbmF0aGFuIEJlbG1ha2VyIGpvbmF0aGFuLmJlbG1ha2VyQGdtYWlsLmNvbXxUb28gZmV3IHllYXJzfAp8SVMtTU9BR3xJc3JhZWx8SXNyYWVsfElzcmFlbGkgTWluaXN0cnkgb2YgQWdyaWN1bHR1cmV8QXNpYXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8T3JlbiBTb25pbiBvcmVuc0Btb2FnLmdvdi5pbCBhbmQgRG9yaSBFZGVsaXN0IGJsYWNrcmVlZnNAZ21haWwuY29tfEluY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHNwYWNlIGFuZCB0aW1lfAp8TUVESVRTICB8TWVkaXRlcnJhbmVhbnxNZWRpdGVycmFuZWFufE11bHRpcGxlfEV1cm9wZXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8Q29udGFjdCBjb3JyZXNwb25kaW5nIGF1dGhvciBmb3IgY29udGFjdHN8SW5jbHVkZWR8CnxNUlR8TWF1cml0YW5pYXxNYXVyaXRhbmlhfEluc3RpdHV0IE1hdXJpdGFuaWVuIGRlIFJlY2hlcmNoZXMgT2PDqWFub2dyYXBoaXF1ZXMgZXQgZGVzIFDDqmNoZXMsIE5vdWFkaGlib3UsIE1hdXJpdGFuaWF8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxCZXlhaCBNZWlzc2EgYm1vdWxkaGFiaWJAZ21haWwuY29tfEluY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHNwYWNlIGFuZCB0aW1lfAp8TkFNICB8TmFtaWJpYXxOYW1pYmlhfE5hdGlvbmFsIE1hcmluZSBJbmZvcm1hdGlvbiBhbmQgUmVzZWFyY2ggQ2VudHJlLCBNaW5pc3RyeSBvZiBGaXNoZXJpZXMgYW5kIE1hcmluZSBSZXNvdXJjZXMsIE5hbWliaWF8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxKb2hhbm5lcyBLYXRoZW5hIGpvaG4ua2F0aGVuYUBtZm1yLmdvdi5uYXxJbmNsdWRlZHwKfE5FVVMtRmFsbCAgfE5FIFVTIEZhbGx8Tm9ydGhlYXN0IFVTQSBGYWxsfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8TkVVUy1TcHJpbmcgIHxORSBVUyBTcHJpbmd8Tm9ydGhlYXN0IFVTQSBTcHJpbmd8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxOSUdGUy0xICB8TiBJcmVsYW5kIFExfE5vcnRoIElyZWxhbmQgUXVhcnRlciAxfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfE5JR0ZTLTQgIHxOIElyZWxhbmQgUTR8Tm9ydGggSXJlbGFuZCBRdWFydGVyIDR8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8Tm9yLUJUUy0zICB8QmFyZW50cyBTZWEgTm9yd2F5IFEzfEJhcmVudHMgU2VhIE5vcndheSBRM3xJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxOUy1JQlRTLTEgIHxOIFNlYSBRMXxOb3J0aCBTZWEgUXVhcnRlciAxfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfE5TLUlCVFMtMyAgfE4gU2VhIFEzfE5vcnRoIFNlYSBRdWFydGVyIDN8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8TlotQ0hBVCAgfENoYXRoYW0gUmlzZSBOWnxDaGF0aGFtIFJpc2UgTmV3IFplYWxhbmR8TmF0aW9uYWwgSW5zdGl0dXRlIG9mIFdhdGVyIGFuZCBBdG1vc3BoZXJpYyBSZXNlYXJjaCBMaW1pdGVkLCBOZXcgWmVhbGFuZHwgT2NlYW5pYXwgUmVxdWlyZXMgZGF0YSByZXF1ZXN0fFJpY2hhcmQgTydEcmlzY29sbCByaWNoYXJkLm9kcmlzY29sbEBuaXdhLmNvLm56IGFuZCBGYWJyaWNlIFN0ZXBoZW5zb24gZmFicmljZS5zdGVwaGVuc29uQHdhaWthdG8uYWMubnp8SW5jbHVkZWR8CnxOWi1FQ1NJICB8RSBDb2FzdCBTIElzbGFuZCBOWnxFYXN0IENvYXN0IFNvdXRoIElzbGFuZCBOZXcgWmVhbGFuZHxOYXRpb25hbCBJbnN0aXR1dGUgb2YgV2F0ZXIgYW5kIEF0bW9zcGhlcmljIFJlc2VhcmNoIExpbWl0ZWQsIE5ldyBaZWFsYW5kfCBPY2VhbmlhfCBSZXF1aXJlcyBkYXRhIHJlcXVlc3R8UmljaGFyZCBPJ0RyaXNjb2xsIHJpY2hhcmQub2RyaXNjb2xsQG5pd2EuY28ubnogYW5kIEZhYnJpY2UgU3RlcGhlbnNvbiBmYWJyaWNlLnN0ZXBoZW5zb25Ad2Fpa2F0by5hYy5uenxJbmNsdWRlZHwKfE5aLVNVQkEgIHxTdWItQW50YXJjdGljIE5afFN1Yi1BbnRhcmN0aWMgTmV3IFplYWxhbmR8TmF0aW9uYWwgSW5zdGl0dXRlIG9mIFdhdGVyIGFuZCBBdG1vc3BoZXJpYyBSZXNlYXJjaCBMaW1pdGVkLCBOZXcgWmVhbGFuZHwgT2NlYW5pYXwgUmVxdWlyZXMgZGF0YSByZXF1ZXN0fFJpY2hhcmQgTydEcmlzY29sbCByaWNoYXJkLm9kcmlzY29sbEBuaXdhLmNvLm56IGFuZCBGYWJyaWNlIFN0ZXBoZW5zb24gZmFicmljZS5zdGVwaGVuc29uQHdhaWthdG8uYWMubnp8SW5jbHVkZWR8CnxOWi1XQ1NJICB8VyBDb2FzdCBTIElzbGFuZCBOWnxXZXN0IENvYXN0IFNvdXRoIElzbGFuZCBOZXcgWmVhbGFuZHxOYXRpb25hbCBJbnN0aXR1dGUgb2YgV2F0ZXIgYW5kIEF0bW9zcGhlcmljIFJlc2VhcmNoIExpbWl0ZWQsIE5ldyBaZWFsYW5kfCBPY2VhbmlhfCBSZXF1aXJlcyBkYXRhIHJlcXVlc3R8UmljaGFyZCBPJ0RyaXNjb2xsIHJpY2hhcmQub2RyaXNjb2xsQG5pd2EuY28ubnogYW5kIEZhYnJpY2UgU3RlcGhlbnNvbiBmYWJyaWNlLnN0ZXBoZW5zb25Ad2Fpa2F0by5hYy5uenxJbmNsdWRlZHwKfFBULUlCVFMgIHxQb3J0dWdhbHxQb3J0dWdhbHxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxST0NLQUxMICB8Um9ja2FsbCBQbGF0ZWF1fFJvY2thbGwgUGxhdGVhdXxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxTLUdFT1JHICB8UyBHZW9yZ2lhfFNvdXRoIEdlb3JnaWF8QnJpdGlzaCBBbnRhcmN0aWMgU3VydmV5fFNvdXRoZXJuIE9jZWFufFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxNYXJrIEJlbGNoaWVyIG1hcmsuYmVsY2hpZXJAZ292LmdzIGFuZCBNYXJ0aW4gQ29sbGlucyBtYWNvbEBiYXMuYWMudWt8SW5jbHVkZWR8CnxTQ1MtRmFsbCAgfFNjb3RpYW4gU2hlbGYgRmFsbHxTY290aWFuIFNoZWxmIFN1bW1lcnxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfENhbmFkYXxQdWJsaWN8aHR0cHM6Ly9vcGVuLmNhbmFkYS5jYS9kYXRhL2VuL2RhdGFzZXQvMTM2NmUxZjEtZTJjOC00OTA1LTg5YWUtZTEwZjFiZTBhMTY0IGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfFRvbyBmZXcgeWVhcnN8SW5jbHVkZWR8CnxTQ1MtU1BSSU5HICB8U2NvdGlhbiBTaGVsZiBTcHJpbmd8U2NvdGlhbiBTaGVsZiBTcHJpbmd8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3wgQ2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC9mZWNmMDQ1YS05NWEyLTRiNjktOGE0MC04MTg2NDlhNjI3MTYgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8VG9vIG11Y2ggZGF0YSBsb3NzIGFmdGVyIHNwYXRpYWwgdGVtcG9yYWwgc3RhbmRhcmRpemF0aW9ufAp8U0NTLVNVTU1FUiAgfFNjb3RpYW4gU2hlbGYgU3VtbWVyfFNjb3RpYW4gU2hlbGYgU3VtbWVyfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC8xMzY2ZTFmMS1lMmM4LTQ5MDUtODlhZS1lMTBmMWJlMGExNjQgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxTRVVTLWZhbGwgIHxTRSBVUyBGYWxsfFNvdXRoZWFzdCBVU0EgRmFsbHxOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbnwgVVNBfFB1YmxpY3xEaXNNQVA6IGh0dHBzOi8vYXBwcy1zdC5maXNoZXJpZXMubm9hYS5nb3YvZGlzbWFwLyBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfFNFVVMtc3ByaW5nICB8U0UgVVMgU3ByaW5nfFNvdXRoZWFzdCBVU0EgU3ByaW5nfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8U0VVUy1zdW1tZXIgIHxTRSBVUyBTdW1tZXJ8U291dGhlYXN0IFVTQSBTdW1tZXJ8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxTV0MtSUJUUy0xICB8U2NvdGxhbmQgU2hlbGYgU2VhIFExfFNjb3RsYW5kIFNoZWxmIFNlYSBRdWFydGVyIDF8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8U1dDLUlCVFMtNCAgfFNjb3RsYW5kIFNoZWxmIFNlYSBRNHxTY290bGFuZCBTaGVsZiBTZWEgUXVhcnRlciA0fEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfFdCTFN8IFdlc3Rlcm4gQmxhY2sgU2VhfCBXZXN0ZXJuIEJsYWNrIFNlYXxJbnN0aXR1dGUgb2YgRmlzaCBSZXNvdXJjZXMsIEJ1bGdhcmlhfEV1cm9wZXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8RWxpdHNhIFBldHJvdmEgKGVsaXRzc2FAeWFob28uY29tKSwgRmVyaWhhIFRzZXJrb3ZhICYgVmVzc2VsaW5hIE1paG5ldmF8IFRvbyBmZXcgeWVhcnN8CnxXQ0FOTiAgfFcgQ29hc3QgVVN8V2VzdCBDb2FzdCBVU0F8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxaQUYtQVRMICB8QXRsYW50aWMgT2NlYW4gWkF8QXRsYW50aWMgT2NlYW4gU291dGggQWZyaWNhfERlcGFydG1lbnQgb2YgRm9yZXN0cnksIEZpc2hlcmllcyBhbmQgdGhlIEVudmlyb25tZW50LCBTb3V0aCBBZnJpY2F8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHwgVHJhY2V5IEZhaXJ3ZWF0aGVyIHRyYWNleWZAZGFmZi5nb3YuemF8SW5jbHVkZWR8CnxaQUYtSU5EICB8SW5kaWFuIE9jZWFuIFpBfEluZGlhbiBPY2VhbiBTb3V0aCBBZnJpY2F8RGVwYXJ0bWVudCBvZiBGb3Jlc3RyeSwgRmlzaGVyaWVzIGFuZCB0aGUgRW52aXJvbm1lbnQsIFNvdXRoIEFmcmljYXxBZnJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fCBUcmFjZXkgRmFpcndlYXRoZXIgdHJhY2V5ZkBkYWZmLmdvdi56YXxJbmNsdWRlZHwKCgoKCmBgYHtyIHB1bGwgaW4gZmlzaGdsb2IgZGF0YWJhc2V9CgpGaXNoR2xvYl8xLjUgPC0gZnJlYWQoaGVyZTo6aGVyZSgiZGF0YSIsIkZJU0hHTE9CX3YxLjVfY2xlYW4uY3N2IikpCgpgYGAKClRoaXMgdmVyc2lvbiBvZiBGaXNoR2xvYiBsZWF2ZXMgb3V0IHNlYXNvbnMgZm9yIEdNRVgsIGZpeCBoZXJlCgpgYGB7ciBhZGQgc2Vhc29uIHRvIEdNRVh9CiNhZGQgc2Vhc29uIHRvIEdNRVggdG8gc3VydmV5IHVuaXQKCkZpc2hHbG9iXzEuNVtzdXJ2ZXkgPT0gIkdNRVgiLCBzdXJ2ZXlfdW5pdCA6PSBwYXN0ZTAoc3VydmV5LCItIixzZWFzb24pXQpgYGAKCkFsc28gYWRkaW5nIGluIHNlYXNvbnMgZm9yIE5JR0ZTCgpgYGB7ciBhZGQgc2Vhc29uIHRvIE5JR0ZTfQojYWRkIHNlYXNvbiB0byBHTUVYIHRvIHN1cnZleSB1bml0CgpGaXNoR2xvYl8xLjVbc3VydmV5ID09ICJOSUdGUyIsIHN1cnZleV91bml0IDo9IHBhc3RlMChzdXJ2ZXksIi0iLHF1YXJ0ZXIpXQpgYGAKClpBRiAoU291dGggQWZyaWNhKSBoYXMgZGlzdGluY3QgQXRsYW50aWMgYW5kIEluZGlhbiBzdXJ2ZXlzIChzcGxpdCAgYXQgfjIwLjAxy5ogRSwgQ2FwZSBBZ3VsaGFzKQoKYGBge3IgYWRkIGxvbmdpdHVkaW5hbCByZWdpb24gdG8gWkFGfQpGaXNoR2xvYl8xLjVbc3VydmV5ID09ICJaQUYiICYgbG9uZ2l0dWRlIDwyMC4wMSwgc3VydmV5X3VuaXQgOj0gIlpBRi1BVEwiXVtzdXJ2ZXkgPT0gIlpBRiIgJiBsb25naXR1ZGUgPj0gMjAuMDEsIHN1cnZleV91bml0IDo9ICJaQUYtSU5EIl0KYGBgCgpSZWdpb24gbmFtZXMKYGBge3J9CnNvcnQodW5pcXVlKEZpc2hHbG9iXzEuNVssc3VydmV5X3VuaXRdKSkKYGBgCiMjRGF0YSBSZXBsYWNlbWVudHMKIyMjI0dyZWVubGFuZCAodmVyc2lvbiBpbiBGaXNoR2xvYiAxLjUgaXMgbWlzc2luZyBsZW5ndGhzIGFuZCB0aGVyZWZvcmUgYmlvbWFzcyB2YWx1ZXMpClRoaXMgdmVyc2lvbiB3YXMgb2J0YWluZWQgZGlyZWN0bHkgZnJvbSBLYXJsLU1pY2hhZWwgV2VybmVyIFtrYXJsLW1pY2hhZWwud2VybmVyQHRodWVuZW4uZGVdKGthcmwtbWljaGFlbC53ZXJuZXJAdGh1ZW5lbi5kZSkgd2hvIG5vdyBtYW5hZ2VzIHRoZSBHcmVlbmxhbmQgc3VydmV5IFNlcHRlbWJlciAyMDIzLiBIZSBpcyBiYXNlZCBpbiBHZXJtYW55LgoKYGBge3J9CiNncmVlbmxhbmQgPC0gCgpgYGAKCiMjIyNOb3J3YXkKUHJlcHBlZCBieSBMYXVyZW5lIFBlY3VjaGV0IChVIFRyw7Ztc28sIE5vcndheSkgU2VwdGVtYmVyIDIwMjMgdG8gcmVwbGFjZSB3aGF0J3MgaW4gRmlzaEdsb2IgMS41IGJlY2F1c2UgSU1SICJhcmUgcXVpdGUgY29uY2VybmVkIHRoYXQgRmlzaEdsb2IsIGFuZCBvdGhlciBzdHVkaWVzLCBoYXZlIGJlZW4gdXNpbmcgYSAiZmxhd2VkIiBtdWx0aS1zdXJ2ZXlzIGRhdGFzZXQgdGhhdCBpcyBhdmFpbGFibGUgaW4gTk1EQyAoZGF0YSBwb3J0YWwgb2YgSU1SKS4gVHVybnMgb3V0IHRoYXQgdGhpcyBkYXRhc2V0IHdhcyBwdXQgcHVibGljbHkgYnkgbWlzY29tbXVuaWNhdGlvbiBvbiBOTURDIGFmdGVyIG9uZSBwdWJsaXNoZWQgcGFwZXIgaW4gU2NpZW50aWZpYyBSZXBvcnRzLCBhbmQgSSB0aGluayB0aGV5IG9ubHkgcmVhbGl6ZWQgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIGRhdGFzZXQganVzdCB0aGUgbGFzdCB5ZWFyIGFzIHNvbWUgcGFwZXJzIGFyZSBjb21pbmcgb3V0IHVzaW5nIGl0IChlc3BlY2lhbGx5IHRoZSBvbmUgZnJvbSBDZXNjIEdvcmRvLVZpbGFzZWNhIGluIFBOQVMgaHR0cHM6Ly93d3cucG5hcy5vcmcvZG9pLzEwLjEwNzMvcG5hcy4yMTIwODY5MTIwKS4gVGhleSBhcmUgbm93IHRyeWluZyB0byBtYWtlIHNvbWUgZGFtYWdlIGNvbnRyb2xzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZGF0YXNldCBpcyBub3QgdXNlZCBldmVyIGFnYWluIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGF0IGNsZWFuZGVkIGFuZCBzdGFuZGFyZGlzZWQgZGF0YXNldHMgb2YgdGhlIEJhcmVudHMgU2VhIHN1cnZleSB0aGF0IGFyZSBwdWJsaWNseSBhdmFpbGFibGUgaW4gTk1EQyBhcmUgdXNlZCBpbnN0ZWFkIG9mLgoKU2VwdGVtYmVyIDE0OiBGcm9tIExhdXJlbmUsICJJIHNlbmQgeW91IGluIGF0dGFjaG1lbnQgdGhlIOKAnG5ld+KAnSBJTVIgc3VydmV5IGZvcm1hdHRlZCBmb3IgRmlzaGdsb2IuIEkgaGF2ZSBkb25lIHNvbWUgc21hbGwgY2hlY2sgb2YgdGhlIGRhdGFzZXQsIGFuZCBzbyBmYXIgZXZlcnl0aGluZyBsb29rcyBnb29kLCBidXQgSSBkaWRu4oCZdCBkbyBhIGRlZXAgY2hlY2sgeWV0LCBidXQgSSBkb27igJl0IHNlZSB3aHkgdGhlcmUgc2hvdWxkIGJlIGFueSBwcm9ibGVtcyB3aXRoIGl0Li4uLkZvciB5b3VyIHN0dWR5LCBJIHRoaW5rIGl0IGlzIGFsc28gaW1wb3J0YW50IHRoYXQgeW91IGtub3cgdGhhdCB0aGVyZSBoYXMgYmVlbiBzb21lIGluY29uc2lzdGVuY2llcyBpbiB0YXhvbm9taWMgZGVzY3JpcHRpb25zIGluIHRoZSBCYXJlbnRzIFNlYSBzbyB0aGF0IHNvbWUgc3BlY2llcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhdCB0aGUgZ2VudXMgbGV2ZWwgaW5zdGVhZCBvZiBmb3IgYmlvZGl2ZXJzaXR5IGFuYWx5c2lzLCBJIHNlbmQgeW91IGluIGF0dGFjaCBhbiBleGNlbCAoQmFyZW50cyBTZWEgRmlzaCBSZWZlcmVuY2UgTGlzdC5jc3YpIGZpbGUgdGhhdCBzdW1tYXJpemUgd2hpY2ggc3BlY2llcyBtaWdodCBiZSBhIG1pc2lkZW50aWZpY2F0aW9uIGFuZCB3aGljaCBvbmUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYW5kIG1lcmdlZC4iIEFsbCBvZiB0aGVzZSBmaWxlcyBub3cgbGl2ZSBpbiAiZGF0YS9Ob3J3YXlfU2VwMjAyMyIKCkhlbHBmdWwgZ3VpZGFuY2UgZnJvbSBoZXJlOiBodHRwczovL3d3dy5oaS5uby9lbi9oaS9uZXR0cmFwcG9ydGVyL3JhcHBvcnQtZnJhLWhhdmZvcnNrbmluZ2VuLWVuLTIwMjEtMTUKLSAiMi4yLjUgLSBSZWNvbW1lbmRlZCBhZGp1c3RtZW50cyB0byB0aGUgb3V0cHV0IGJlZm9yZSBhbmFseXNpcwpFZWxwb3V0cyBhbmQgbGlwYXJpZHMuIFdoZW4gY29tYmluZyB5ZWFycywgd2UgcmVjb21tZW5kIHRoYXQgYWxsIHJlY29yZHMgb2YgZWVscG91dHMgKFpvYXJjaWRhZSkgYXJlIHBvb2xlZCB0byB0aGUgZmFtaWx5IGxldmVsLCBiZWNhdXNlIHRoZXkgYXJlIG5vdG9yaW91c2x5IGRpZmZpY3VsdCB0byBpZGVudGlmeSAoc2VlIEFwcGVuZGl4IDMpLiBUaGUgc2FtZSBhcHBseSB0byBsaXBhcmlkcyAoTGlwYXJpZGFlKS4gSWYgc3BlY2llcyBsZXZlbCBkYXRhIG9mIHRoZXNlIGZhbWlsaWVzIGFyZSB1c2VkLCBjb25zaWRlciBleGNsdWRpbmcgZGF0YSBmcm9tIDIwMDQtMjAwNi8yMDA3LiBUaGVzZSB5ZWFycyB0aGUgc3RhZmYgb24gc29tZSBvZiB0aGUgTm9yd2VnaWFuIHZlc3NlbHMgd2VyZSBpbmV4cGVyaWVuY2VkLCBhbmQgcHJvcGVyIGlkZW50aWZpY2F0aW9uIGtleXMgZm9yIGFyY3RpYyBzcGVjaWVzIHdlcmUgbGFja2luZyAoY29tcGFyZSBmb3IgaW5zdGFuY2UgY2F0Y2hlcyBvZiBMeWNvZGVzIGZyaWdpZHVzIGFuZCBMeWNvZGVzIGV1ZGlwbGV1cm9zdGljdHVzIGluIHRoZSBmaXJzdCB5ZWFycyB0byB0aGUgbGF0ZXIgeWVhcnMsIEFwcGVuZGl4IDMpLiBJZiBzcGVjaWVzIGxldmVsIGRhdGEgb2YgdGhlc2UgZmFtaWxpZXMgYXJlIHVzZWQsIHJlY29yZHMgdG8gZmFtaWx5IGxldmVscyBzaG91bGQgYmUgcmVtb3ZlZCBvciBlbHNlIHRoZXNlIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIHNwZWNpZXMgaW4gdGhlIGZ1cnRoZXIgYW5hbHlzaXMgb2YgdGhlIGRhdGEuIEJvdGggWm9hcmNpZGFlIGFuZCBMaXBhcmlkYWUgaGF2ZSB1bnJlc29sdmVkIHRheG9ub215IGZvciBzb21lIGdlbmVyYSwgdGhlcmVmb3JlIHdlIGhhdmUgY2hvc2VuIHRvIHBvb2wgYWxsIGxpcGFyaWRzIG9mIHRoZSBnZW51cyBDYXJlcHJvY3R1cyBhbmQgYWxsIGVlbHBvdXRzIG9mIHRoZSBnZW51cyBHeW1uZWx1cyBpbiB0aGUgb3V0cHV0LiBTZWJhc3Rlcy4gVGhlIGNvbHVtbiAiIFNlYmFzdGVzIHNwcC4iIGNvbnRhaW5zIG1haW5seSBqdXZlbmlsZSByZWRmaXNoLiBTbWFsbCBzcGVjaW1lbnMgYXJlIHZlcnkgZGlmZmljdWx0IHRvIGlkZW50aWZ5IHNvIHRoZSBwcm90b2NvbCBpcyB0byBpZGVudGlmeSBvbmx5IGluZGl2aWR1YWxzIGxhcmdlciB0aGFuIDEwIGNtIHRvIHRoZSBzcGVjaWVzIGxldmVsLiBCZWZvcmUgYW5hbHlzaXMsIGFsbCByZWRmaXNoICggUyAuIG1lbnRlbGxhICwgUy4gbm9ydmVnaWN1cywgUy4gdml2aXBhcnVzIGFuZCBTZWJhc3RlcyBzcHAgLikgc2hvdWxkIGJlIHBvb2xlZCwgb3IgU2ViYXN0ZXMgc3BwLiBzaG91bGQgYmUgcmVtb3ZlZCDigJMgaWYgbm90IGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIHNwZWNpZXMgaW4gdGhlIGFuYWx5c2lzIC4gUmVjb3JkcyBpbiBBcHBlbmRpeCAyLiBUaGUgcmVjb3JkcyBvZiB0aGUgUy4gdml2aXBhcnVzIHdlc3Qgb2YgU3ZhbGJhcmQoU3BpdHNiZXJnZW4pIGFyZSB1bnJlbGlhYmxlIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBpZiBTZWJhc3RlcyBkYXRhIGFyZSBrZXB0IGF0IHRoZSBzcGVjaWVzIGxldmVsIChBcHBlbmRpeCAyKS4gU3BlY2llcyB2ZXJpZmllZCBmb3IgdGhlIEJhcmVudHMgU2VhLCBidXQgb3V0bGllcnMgaW4gdGVybXMgdGhlIG5vcm1hbCBkZXB0aCByYW5nZSwgZGlzdHJpYnV0aW9uIGFyZWEgd2l0aGluIHRoZSBCYXJlbnRzIFNlYSwgc2l6ZSBldGMuIHdlcmUgY29kZWQgYXMgcXVlc3Rpb25hYmxlIGluIHRoZSBkYXRhIGJhc2UgKEFwcGVuZGl4IDIpIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBiZWZvcmUgYW5hbHlzaXMuIENvbnNpZGVyIGFsc28gcmVtb3ZpbmcgcGVsYWdpYyBzcGVjaWVzIChlLmcuIGNhcGVsaW4gYW5kIGhlcnJpbmcpLCBhcyB0aGVzZSBhcmUgcG9vcmx5IHNhbXBsZWQgYnkgdGhlIGJvdHRvbSB0cmF3bC4gVGhlIGRhdGEgc2hvdWxkIGJlIHN0YW5kYXJkaXNlZCB3aXRoIHRvd2luZyBkaXN0YW5jZSBiZWZvcmUgYW5hbHlzaXMuIgoKVGhlcmVmb3JlLCB3ZSB3aWxsOgotIFJlbW92ZSBhbGwgcmVjb3JkcyBvZiBlZWxwb3V0cyBhbmQgbGlwYXJpZHMgKEZhbWlseSA9IFpvYXJjaWRhZSBvciBMaXBhcmlkYWUpIChhcyB3ZSBvbmx5IGluY2x1ZGUgc3BlY2llcyBJRCdkIHRvIHNwZWNpZXMpCi0gUmVtb3ZlIHJlZGZpc2ggKEdlbnVzID0gU2ViYXN0ZXMpCgpgYGB7ciBub3J3YXkgZGF0YX0KCiNsb2FkIE5vcndlZ2lhbiBkYXRhCmxvYWQoaGVyZTo6aGVyZSgiZGF0YSIsIk5vcndheV9TZXAyMDIzIiwiTk9SLUJUU19jbGVhbi5SRGF0YSIpKQpub3J3YXlfY2xlYW4gPC0gZGF0YS50YWJsZShkYXRhKQoKI3JlbW92ZSBvYnNlcnZhdGlvbnMgd2l0aG91dCBkYXRlcwpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuW2NvbXBsZXRlLmNhc2VzKG5vcndheV9jbGVhblssLihtb250aCldKSxdCgojcmVtb3ZlIHNwZWNpZXMgcmVjb3JkcyBpbiBhY2NvcmRhbmNlIHdpdGggcmVjb21tZW5kYXRpb24gZnJvbSBISQpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuWyEoZmFtaWx5ICVpbiUgYygiWm9hcmNpZGFlIiwiTGlwYXJpZGFlIikgfCBnZW51cyA9PSAiU2ViYXN0ZXMiKSxdCgojc29tZSBjb2x1bW4gbmFtZXMgZG9uJ3QgbWF0Y2ggZmlzaGdsb2IgKGZpc2hnbG9iID0gbnVtLCBudW1faCwgbnVtX2NwdWUsIHdndCwgd2d0X2gsIHdndF9jcHVlOyBub3J3YXkgPSBudW0sIG51bV9jcHVlIChudW1iZXIgb2YgaW5kLi9ob3VyKSwgbnVtX2NwdWEgKG51bWJlciBvZiBpbmQuL2ttMiksIHdndCwgd2d0X2NwdWUgKGtnL21pbiksIHdndF9jcHVhKGtnL2ttMikgICkKI2Fsc28sIHNvbWUgY29sdW1uIHVuaXRzIGluIHRoZSByZWFkbWUgYXJlIGluIGNvcnJlY3QuIFRoZXJlZm9yZSwgSSB3aWxsIGdlbmVyYXRlIF9jcHVlIGFuZCBfaCB2YWx1ZXMgaGVyZQojIHdlIHdpbGwgbmVlZCB0byBjaGVjayAgYW5kIHJlbmFtZSBjb2x1bW5zCnNldG5hbWVzKG5vcndheV9jbGVhbiwgYygiaGF1bF9kdXIiKSwgYygiaGF1bF9kdXJfbSIpKQpub3J3YXlfY2xlYW5bLGhhdWxfZHVyIDo9IGhhdWxfZHVyX20vNjBdICNoYXVsIGR1cmF0aW9uIGN1cnJlbnRseSBpbiBtaW51dGVzLCBuZWVkIGhvdXJzCm5vcndheV9jbGVhblssbnVtX2ggOj0gbnVtL2hhdWxfZHVyXVssbnVtX2NwdWUgOj0gbnVtL2FyZWFfc3dlcHRdWyx3Z3RfaCA6PSB3Z3QvaGF1bF9kdXJdWyx3Z3RfY3B1ZSA6PSB3Z3QvYXJlYV9zd2VwdF0KCiNjaGFuZ2Ugc29tZSBjb2x1bW5zIHRvIG51bWVyaWMKY29scyA9IGMoIm1vbnRoIiwiZGF5IikKbm9yd2F5X2NsZWFuWywoY29scykgOj0gbGFwcGx5KC5TRCxhcy5udW1lcmljKSwuU0Rjb2xzID0gY29sc10KCiNhbHNvLCBkZWxldGUgc291cmNlIGFuZCB0aW1lc3RhbXAKZmlzaGdsb2JfY29sbmFtZXMgPC0gY29sbmFtZXMoRmlzaEdsb2JfMS41KQpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuWywuLmZpc2hnbG9iX2NvbG5hbWVzXQoKbm9yd2F5X2NsZWFuW3N1cnZleSA9PSAiTm9yLUJUUyIgJiBtb250aCAlaW4lIGMoMTo2KSwgc3VydmV5X3VuaXQgOj0gIk5vci1CVFMtMSJdW3N1cnZleSA9PSAiTm9yLUJUUyIgJiBtb250aCAlaW4lIGMoNzoxMiksIHN1cnZleV91bml0IDo9ICJOb3ItQlRTLTMiXQoKI092ZXJsYXAgYmV0d2VlbiBJQlRTIGFuZCBOb3ItQlRTIHN1cnZleXMgYmVsb3cgNjLLmmxhdGl0dWRlLCBzbyBkZWxldGUgYWxsIGhhdWxzIHRoYXQgb2NjdXIgYmVsb3cgNjLLmmxhdGl0dWRlCm5vcndheV9jbGVhbiA8LSBub3J3YXlfY2xlYW5bbGF0aXR1ZGUgID49IDYyLF0KCmBgYAoKCkRlbGV0ZSBHcmVlbmxhbmQgYW5kIE5vcndheQpgYGB7cn0KRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKHN1cnZleSAlaW4lIGMoIk5vci1CVFMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMiR1JMLURFIiAjaWdub3JlIGdyZWVubGFuZCBmb3Igbm93Li4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXQpgYGAKCgpBZGQgaW4gdXBkYXRlZCBHcmVlbmxhbmQgYW5kIE5vcndheSBkYXRhCmBgYHtyfQpGaXNoR2xvYl8xLjUgPC1yYmluZChGaXNoR2xvYl8xLjUsbm9yd2F5X2NsZWFuKQojRmlzaEdsb2JfMS41IDwtcmJpbmQoRmlzaEdsb2JfMS41LGdyZWVubGFuZCkKYGBgCgoKIyNQcmVsaW1pbmFyeSBEYXRhIEN1dHMKIyMjU3BlY2lmaWMgUmVnaW9uYWwgQ2hhbmdlcyBCZWZvcmUgQ3V0dGluZyB0byAxMCB5ZWFycyBvbmx5CgoqR1NMKgotIE5vcnRoOiB3ZSBoYXZlIGRhdGEgMTk4MC0yMDE5LCBidXQgZ2VhciBjaGFuZ2VzIGluIDIwMDQvMjAwNSwgc28gbGV0J3MgdXNlIGxhdGVyIHBvcnRpb24gKG1vcmUgY29uc2lzdGVudCBtb250aHMgb2Ygc2FtcGxpbmc7IDIwMDUtMjAxOTsgMTUgeWVhcnMpIAotIFNvdXRoOiB3ZSBoYXZlIGRhdGEgMTk3MC0yMDE5LCBidXQgZ2Vhci92ZXNzZWwgY2hhbmdlcyBpbiAxOTg1IGFuZCBhZ2FpbiBpbiAxOTkyLCBzbyBhZ2FpbiBsZXQncyB1c2UgbGF0ZXIgcG9ydGlvbiAoMTk5Mi0yMDE5OyAyNyB5ZWFycykKLSBTZWUgW3RoaXMgZ2l0aHViIGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vQXF1YUF1bWEvZmlzaGdsb2IvaXNzdWVzLzcyKQoKYGBge3IgR1NMIGZpeGVzfQojaWRlbnRpZnkgaGF1bF9pZHMgb2YgaGF1bHMgd2Ugc2hvdWxkIHJlbW92ZSBmcm9tIEdTTCBzdXJ2ZXlzCmhhdWxfaWRzX3RvX3JlbW92ZV9HU0wgPC0gdW5pcXVlKEZpc2hHbG9iXzEuNVsoc3VydmV5ID09ICJHU0wtTiIgJiB5ZWFyIDwgMjAwNSl8KHN1cnZleSA9PSAiR1NMLVMiICYgeWVhciA8IDE5OTIpLGhhdWxfaWRdKQoKRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKGhhdWxfaWQgJWluJSBoYXVsX2lkc190b19yZW1vdmVfR1NMKSxdICNyZW1vdmUgaGF1bHMgYmVmb3JlIGNvbnNpc3RlbnQgZ2Vhci92ZXNzZWwgd2FzIHVzZWQKYGBgCgoqU0dFT1JHKgotIEZyb20gTWFydGluIENvbGxpbnMsICJNb3N0IHN1cnZleXMgd2VyZSBmb2N1c2VkIG9uIGRlbWVyc2FsIGZpc2ggb24gdGhlIFNvdXRoIEdlb3JnaWEgc2hlbGYgKDwgMzUwIG0pLCBidXQgc3VydmV5cyBpbiAyMDAzLCAyMDEwIGFuZCAyMDE5IGhhZCBzb21lIGRlZXBlciB0cmF3bHMuICBUaGUgZGVlcGVyIHRyYXdscyBjYXVnaHQgdmVyeSBkaWZmZXJlbnQgZmlzaCwgc28gYXJlIHVubGlrZWx5IHRvIGJlIG9mIHVzZSB0byBhIGxvbmctdGVybSBhbmFseXNpcywgYnV0IEkgaGF2ZSBsZWZ0IHRoZW0gaW4uIgoKLURlbGV0ZSBhbGwgdHJhd2xzIGRlZXBlciB0aGFuIDM1MCBNCmBgYHtyfQpoYXVsX2lkc190b19yZW1vdmVfU0dFT1JHIDwtIHVuaXF1ZShGaXNoR2xvYl8xLjVbKHN1cnZleSA9PSAiU0dFT1JHIiAmIGRlcHRoID4zNTApLGhhdWxfaWRdKQoKRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKGhhdWxfaWQgJWluJSBoYXVsX2lkc190b19yZW1vdmVfU0dFT1JHKSxdICNyZW1vdmUgaGF1bHMgYmVmb3JlIGNvbnNpc3RlbnQgZ2Vhci92ZXNzZWwgd2FzIHVzZWQKYGBgCgoqTlotQ0hBVCoKLWJ1bXAgZGVjZW1iZXIgb2JzZXJ2YXRpb25zIHRvIG5leHQgeWVhciBiZWNhdXNlIG9ic2VydmF0aW9ucyBvY2N1ciBpbiAxMiwxLDIKYGBge3J9CiNidW1wIG9ic2VydmF0aW9ucyBmb3J3YXJkCkZpc2hHbG9iXzEuNVtzdXJ2ZXkgPT0gIk5aLUNIQVQiICYgbW9udGggPT0gMTIsICB5ZWFyIDo9IHllYXIrMSwgXQpgYGAKCgojIyNCZWNhdXNlIHRpbWUgaXMgYW4gZXNzZW50aWFsIGNvbXBvbmVudCBvZiB0aGVzZSBhbmFseXNlcywgd2Ugd2lsbCBnZXQgcmlkIG9mIGFueSBzdXJ2ZXkgeCBzZWFzb24gY29tYmluYXRpb25zIHRoYXQgYXJlIG5vdCBzYW1wbGVkIGZvciBhdCBsZWFzdCAxMCB5ZWFycwoKYGBge3Igc3VtbWFyeSBieSBzdXJ2ZXkgcmVnaW9ufQojbmV3IHJvdyBmb3IgdG90YWwgbnVtYmVyIG9mIHllYXJzIHNhbXBsZWQKRmlzaEdsb2JfMS41Wyx5ZWFyc19zYW1wbGVkIDo9IGxlbmd0aCh1bmlxdWUoeWVhcikpLC4oc3VydmV5X3VuaXQpXQoKc3VtbWFyeShGaXNoR2xvYl8xLjUkeWVhcnNfc2FtcGxlZCkgI3JhbmdlcyBmcm9tIDIgKERGTyBTdHJhaWdodCBvZiBHZW9yZ2lhKSB0byA1NyAoTm9ydGhlYXN0IFVTKQpWaWV3KHVuaXF1ZShGaXNoR2xvYl8xLjVbLC4oc3VydmV5X3VuaXQsIHllYXJzX3NhbXBsZWQpXSkpCgojc3RhdGlzdGljcyBhYm91dCBmdWxsIGRhdGFzZXQKbnJvdyhGaXNoR2xvYl8xLjUpIApsZW5ndGgodW5pcXVlKEZpc2hHbG9iXzEuNVssc3VydmV5XSkpIApsZW5ndGgodW5pcXVlKEZpc2hHbG9iXzEuNVssc3VydmV5X3VuaXRdKSkgCgojcmVtb3ZlIG9ic2VydmF0aW9ucyBmb3IgYW55IHJlZ2lvbnMgeCBzZWFzb24gY29tYmluYXRpb25zIHNhbXBsZWQgbGVzcyB0aGFuIDEwIHRpbWVzCkZpc2hHbG9iLjEweWVhciA8LSBGaXNoR2xvYl8xLjVbeWVhcnNfc2FtcGxlZCA+PSAxMCxdCgojc3RhdGlzdGljcyBhYm91dCByZWR1Y2VkIDEwIHllYXIgZGF0YXNldApucm93KEZpc2hHbG9iLjEweWVhcikgCmxlbmd0aCh1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyWyxzdXJ2ZXldKSkgCmxlbmd0aCh1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyWyxhcy5jaGFyYWN0ZXIoc3VydmV5X3VuaXQpXSkpIAoKI3JlbW92ZSBmdWxsIGRhdGFiYXNlCnJtKEZpc2hHbG9iXzEuNSkKCgpgYGAKCiMjI0ZvciB0YXhvbm9taWMgYW5hbHlzZXMsIHJlc29sdXRpb24gdG8gc3BlY2llcyBpcyByZXF1aXJlZC4gVGhlcmVmb3JlLCB3ZSB3aWxsICBleGNsdWRlIGFueSBvYnNlcnZhdGlvbnMgbm90IHJlc29sdmVkIHRvIHNwZWNpZXMuIAoKYGBge3Igc3BwIElEIG9ubHl9CiNtb250aCBhIG51bWJlcgpGaXNoR2xvYi4xMHllYXJbLG1vbnRoIDo9IGFzLm51bWVyaWMobW9udGgpXQoKRmlzaEdsb2IuMTB5ZWFyLnNwcCA8LSBGaXNoR2xvYi4xMHllYXJbcmFuayAlaW4lIGMoIlNwZWNpZXMiLCAiU3Vic3BlY2llcyIpLF0gIzM4NjkzODQgdG90YWwgb2JzZXJ2YXRpb25zCgojcmVtb3ZlIGZ1bGwgc3BlY2llcyBkYXRhYmFzZQpybShGaXNoR2xvYi4xMHllYXIpCgojdmVjdG9yIHdpdGggYWxsIHN1cnZleSBuYW1lcwphbGxfc3VydmV5X3VuaXRzIDwtIHNvcnQodW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBbLHN1cnZleV91bml0XSkpCgojY2FsY3VsYXRlICMgc3BlY2llcyBwZXIgeWVhcgpGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwWywuKHN1cnZleV91bml0LCB5ZWFyLCBhY2NlcHRlZF9uYW1lKV0pCgpGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyWyxzcHBfY291bnRfc3VydmV5X3llYXIgOj0gdW5pcXVlTihhY2NlcHRlZF9uYW1lKSwuKHN1cnZleV91bml0LCB5ZWFyKV0KCkZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIuciA8LXVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyWywuKHN1cnZleV91bml0LCAgeWVhciwgc3BwX2NvdW50X3N1cnZleV95ZWFyKV0pCgpucm93KEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucikKCiNjYWxjdWxhdGUgIyBoYXVscyBwZXIgeWVhcgpGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwWywuKHN1cnZleV91bml0LCB5ZWFyLCBoYXVsX2lkKV0pCgpGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyWyxoYXVsaWRfY291bnRfc3VydmV5X3llYXIgOj0gdW5pcXVlTihoYXVsX2lkKSwuKHN1cnZleV91bml0LCB5ZWFyKV0KCkZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIuciA8LXVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyWywuKHN1cnZleV91bml0LCAgeWVhciwgaGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKV0pCgpucm93KEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucikKCmBgYAoKCiMjVmlzdWFsbHkgSW5zcGVjdCBEaXN0cmlidXRpb24gb2YgRGF0YSBUaHJvdWdoIFRpbWUgYW5kIFNwYWNlCgojI1NwYXRpYWwgYW5kIFRlbXBvcmFsIFBhdHRlcm5zIGluIEFsbCBUcmF3bCBTdXJ2ZXlzCgpMZXQncyBsb29rIGF0IHRoZSBudW1iZXIgb2YgaGF1bHMgcGVyIHllYXIvbW9udGggYW5kIHllYXIvcXVhcnRlciBhbmQgeWVhci9zZWFzb24gdmlzdWFsbHkKCmBgYHtyIGhhdWxzIHBlciB5ZWFyLCBtb250aCwgcXVhcnRlcn0KI3VuaXF1ZSBzdXJ2ZXksIHN1cnZleV91bml0LCB5ZWFyLCBtb250aCwgcXVhcnRlciwgc2Vhc29uLCBoYXVsX2lkLCBsYXQsIGxvbgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBbLC4oc3VydmV5LCBzdXJ2ZXlfdW5pdCwgeWVhcixtb250aCxxdWFydGVyLHNlYXNvbixoYXVsX2lkLCBsYXRpdHVkZSwgbG9uZ2l0dWRlLGhhdWxfZHVyKV0pCgojYWRkIGNvbHVtbiB3aXRoIGFkanVzdGVkIGxvbmdpdHVkZSBmb3IgZmV3IHN1cnZleXMgdGhhdCBjcm9zcyBkYXRlbGluZSAoTlotQ0hBVCBhbmQgQUkpCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1ssbG9uZ2l0dWRlX2FkaiA6PSBpZmVsc2UoKHN1cnZleV91bml0ICVpbiUgYygiQUkiLCJOWi1DSEFUIikgJiBsb25naXR1ZGUgPiAwKSxsb25naXR1ZGUtMzYwLGxvbmdpdHVkZSldCgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLGhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfc2Vhc29uX21vbnRoIDo9dW5pcXVlTihoYXVsX2lkKSwuKHN1cnZleSwgbW9udGgsIHNlYXNvbildWywgI2NvdW50ICMgaGF1bHMgcGVyIHN1cnZleSwgc2Vhc29uLCBhbmQgbW9udGgKICAgICAgICAgICAgICAgICAgICAgaGF1bF9jb3VudHNfcGVyX3N1cnZleV9xdWFydGVyX21vbnRoIDo9dW5pcXVlTihoYXVsX2lkKSwuKHN1cnZleSwgbW9udGgsIHF1YXJ0ZXIpXVssI2NvdW50ICMgaGF1bHMgcGVyIHN1cnZleSwgbW9udGgsIGFuZCBxdWFydGVyCiAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2hhdWxzX3N1cnZleSA6PXVuaXF1ZU4oaGF1bF9pZCksLihzdXJ2ZXkpXVssI2NvdW50ICMgaGF1bHMgcGVyIHN1cnZleSBpbiBhbGwgeWVhcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAjcHJvcG9ydGlvbiBvZiBoYXVscyBmb3IgZWFjaCBzdXJ2ZXksIHNlYXNvbiwgYW5kIG1vbnRoIGRpdmlkZWQgYnkgdG90YWwgIyBvdmVyIGFsbCB5ZWFycwogICAgICAgICAgICAgICAgICAgICBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiA6PWhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfc2Vhc29uX21vbnRoL3RvdGFsX2hhdWxzX3N1cnZleV1bLAogICAgICAgICAgICAgICNwcm9wb3J0aW9uIG9mIGhhdWxzIGZvciBlYWNoIHN1cnZleSwgcXVhcnRlciwgYW5kIG1vbnRoIGRpdmlkZWQgYnkgdG90YWwgIyBvdmVyIGFsbCB5ZWFycwogICAgICAgICAgICAgICAgICAgICBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIgOj1oYXVsX2NvdW50c19wZXJfc3VydmV5X3F1YXJ0ZXJfbW9udGgvdG90YWxfaGF1bHNfc3VydmV5XVssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBoYXVsX2NvdW50X3Blcl9zdXJ2ZXlfeWVhcl9tb250aCA6PXVuaXF1ZU4oaGF1bF9pZCksLih5ZWFyLCBzdXJ2ZXlfdW5pdCwgbW9udGgpXVssICNjb3VudCAjIGhhdWxzIHBlciBzdXJ2ZXkgdW5pdCwgeWVhciwgYW5kIG1vbnRoCiAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2hhdWxzX3N1cnZleV95ZWFyIDo9IHVuaXF1ZU4oaGF1bF9pZCksLihzdXJ2ZXlfdW5pdCx5ZWFyKV1bLCAjY291bnQgdG90YWwgIyBoYXVscyBwZXIgc3VydmV5IHVuaXQgYW5kIHllYXIKICAgICAgICAgICAgICAgICAgICAgI3Byb3BvcnRpb24gb2YgaGF1bHMgZm9yIGVhY2ggc3VydmV5IHVuaXQgYW5kIG1vbnRoIGRpdmlkZWQgYnkgdG90YWwgIyBoYXVscyB3aXRoaW4gYSBzdXJ2ZXkgdW5pdCB3aXRoaW4gYSB5ZWFyCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkgOj0gaGF1bF9jb3VudF9wZXJfc3VydmV5X3llYXJfbW9udGgvdG90YWxfaGF1bHNfc3VydmV5X3llYXJdWywgCgogICAgICAgICAgICAgICAgICAgICBoYXVsX2NvdW50X3Blcl9zdXJ2ZXlfeWVhcl9xdWFydGVyIDo9dW5pcXVlTihoYXVsX2lkKSwuKHllYXIsIHN1cnZleV91bml0LCBxdWFydGVyKV1bLCAjY291bnQgIyBoYXVscyBwZXIgc3VydmV5IHVuaXQsIHllYXIsIGFuZCBtb250aAogICAgICAgICAgICAgICAgICAgICAjcHJvcG9ydGlvbiBvZiBoYXVscyBmb3IgZWFjaCBzdXJ2ZXkgdW5pdCBhbmQgbW9udGggZGl2aWRlZCBieSB0b3RhbCAjIGhhdWxzIHdpdGhpbiBhIHN1cnZleSB1bml0IHdpdGhpbiBhIHllYXIKICAgICAgICAgICAgICAgICAgICAgaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5IDo9IGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX3F1YXJ0ZXIvdG90YWxfaGF1bHNfc3VydmV5X3llYXJdIAoKRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbiA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWywuKHN1cnZleSwgc3VydmV5X3VuaXQsIG1vbnRoLCBzZWFzb24sIGhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfc2Vhc29uX21vbnRoLHRvdGFsX2hhdWxzX3N1cnZleSwgaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pXSkgI3JlbGF0aXZlIHNhbXBsaW5nIGJ5IHNlYXNvbiBhY3Jvc3MgYWxsIHllYXJzCgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlciA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWywuKHN1cnZleSxzdXJ2ZXlfdW5pdCAsIG1vbnRoLCBxdWFydGVyLCBoYXVsX2NvdW50c19wZXJfc3VydmV5X3F1YXJ0ZXJfbW9udGgsdG90YWxfaGF1bHNfc3VydmV5LCBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpXSkgI3JlbGF0aXZlIHNhbXBsaW5nIGJ5IHF1YXJ0ZXIgYWNyb3NzIGFsbCB5ZWFycwoKRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWywuKHN1cnZleSwgeWVhciwgc3VydmV5X3VuaXQsIG1vbnRoLCBoYXVsX2NvdW50X3Blcl9zdXJ2ZXlfeWVhcl9tb250aCx0b3RhbF9oYXVsc19zdXJ2ZXlfeWVhcixoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KV0pICNyZWxhdGl2ZSBzYW1wbGluZyBieSBtb250aCB3aXRoaW4geWVhcnMKCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlciA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWywuKHN1cnZleSwgeWVhciwgc3VydmV5X3VuaXQsIHF1YXJ0ZXIsIGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX3F1YXJ0ZXIsdG90YWxfaGF1bHNfc3VydmV5X3llYXIsaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KV0pICNyZWxhdGl2ZSBzYW1wbGluZyBieSBtb250aCB3aXRoaW4geWVhcnMKCiNob3cgZG9lcyAjaGF1bHMgdmFyeSB3aXRoIHNlYXNvbiBhbmQgbW9udGg/CnN1cnZleV9zZWFzb25fbW9udGhfaGF1bHMgPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb24pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICBmYWNldF93cmFwKH5zdXJ2ZXksc2NhbGVzID0gImZyZWVfeSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZShzdXJ2ZXlfc2Vhc29uX21vbnRoX2hhdWxzLCBmaWxlbmFtZSA9ICJzdXJ2ZXlfc2Vhc29uX21vbnRoX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gNSwgd2lkdGggPSAxNSwgdW5pdHMgPSAiaW4iKQoKI2hvdyBkb2VzICNoYXVscyB2YXJ5IHdpdGggcXVhcnRlciBhbmQgbW9udGg/CnN1cnZleV9xdWFydGVyX21vbnRoX2hhdWxzIDwtIGdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcikgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIGZhY2V0X3dyYXAofnN1cnZleSxzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dzYXZlKHN1cnZleV9xdWFydGVyX21vbnRoX2hhdWxzLCBmaWxlbmFtZSA9ICJzdXJ2ZXlfcXVhcnRlcl9tb250aF9oYXVscy5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDUsIHdpZHRoID0gMTUsIHVuaXRzID0gImluIikKCiNob3cgZG9lcyAjaGF1bHMgdmFyeSB3aXRoIHllYXIgYW5kIG1vbnRoPwp5ZWFyX3N1cnZleV9tb250aF9oYXVscyA8LSBnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aCkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICBmYWNldF93cmFwKH5zdXJ2ZXlfdW5pdCxzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dzYXZlKHllYXJfc3VydmV5X21vbnRoX2hhdWxzLCBmaWxlbmFtZSA9ICJ5ZWFyX3N1cnZleV9tb250aF9oYXVscy5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTYsIHVuaXRzID0gImluIikKZ2dzYXZlKHllYXJfc3VydmV5X21vbnRoX2hhdWxzLCBmaWxlbmFtZSA9ICJ5ZWFyX3N1cnZleV9tb250aF9oYXVscy5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTYsIHVuaXRzID0gImluIikKCiNob3cgZG9lcyAjaGF1bHMgdmFyeSB3aXRoIHllYXIgYW5kIG1vbnRoPwp5ZWFyX3N1cnZleV9xdWFydGVyX2hhdWxzIDwtIGdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXIpICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgZmFjZXRfd3JhcCh+c3VydmV5X3VuaXQsc2NhbGVzID0gImZyZWVfeSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZSh5ZWFyX3N1cnZleV9xdWFydGVyX2hhdWxzLCBmaWxlbmFtZSA9ICJ5ZWFyX3N1cnZleV9xdWFydGVyX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxNiwgdW5pdHMgPSAiaW4iKQpnZ3NhdmUoeWVhcl9zdXJ2ZXlfcXVhcnRlcl9oYXVscywgZmlsZW5hbWUgPSAieWVhcl9zdXJ2ZXlfcXVhcnRlcl9oYXVscy5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTYsIHVuaXRzID0gImluIikKYGBgCgpOb3csIGxldCdzIGxvb2sgYXQgaG93IGxvY2F0aW9uIG9mIHNhbXBsaW5nIHZhcmllcyBieSBtb250aCBvZiBzYW1wbGluZyBhbmQgeWVhciBvZiBzYW1wbGluZyAKCmBgYHtyIGxvY2F0aW9uIGJ5IHllYXIgcGxvdHN9CmxvY2F0aW9uX2J5X3llYXIgPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscykgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICBmYWNldF93cmFwKH5zdXJ2ZXlfdW5pdCwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUobG9jYXRpb25fYnlfeWVhciwgZmlsZW5hbWUgPSAibG9jYXRpb25fYnlfeWVhci5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTIsIHVuaXRzID0gImluIikKCmdnc2F2ZShsb2NhdGlvbl9ieV95ZWFyLCBmaWxlbmFtZSA9ICJsb2NhdGlvbl9ieV95ZWFyLmpwZyIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxMiwgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKGxvY2F0aW9uX2J5X3llYXIsIGZpbGVuYW1lID0gImxvY2F0aW9uX2J5X3llYXIuZXBzIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDEyLCB1bml0cyA9ICJpbiIpCmBgYAoKCmBgYHtyIGxvY2F0aW9uIGJ5IG1vbnRoIHBsb3RzfQoobG9jYXRpb25fYnlfbW9udGggPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscykgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gYXMubnVtZXJpYyhtb250aCkpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICBmYWNldF93cmFwKH5zdXJ2ZXlfdW5pdCwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKGxvY2F0aW9uX2J5X21vbnRoLCBmaWxlbmFtZSA9ICJsb2NhdGlvbl9ieV9tb250aC5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTIsIHVuaXRzID0gImluIikKCmdnc2F2ZShsb2NhdGlvbl9ieV9tb250aCwgZmlsZW5hbWUgPSAibG9jYXRpb25fYnlfbW9udGguanBnIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDEyLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUobG9jYXRpb25fYnlfbW9udGgsIGZpbGVuYW1lID0gImxvY2F0aW9uX2J5X21vbnRoLmVwcyIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxMiwgdW5pdHMgPSAiaW4iKQpgYGAKCgojI1JlZ2lvbiBTcGVjaWZpYyBEYXRhIFByb2Nlc3NpbmcKCi1GcmVkc3RvbiBldCBhbC4gMjAyMiBOYXR1cmUgYW5kIEJhdHQgZXQgYWwuIDIwMTcgRWNvbG9neSBMZXR0ZXJzIGluZm9ybWVkIE5vcnRoIEFtZXJpY2FuIGRhdGEgcHJvY2Vzc2luZwotUGVyc29uYWwgY29tbXVuaWNhdGlvbiB3aXRoIEF1cm9yZSBNYXVyZWF1ZCBhbmQgTGF1cmVuZSBQZWN1Y2hldCByZTogd29yayBieSBBLiBNYXVyZWF1ZCwgTC4gUGVjdWNoZXQgYW5kIFIuIEZyZWxhdCBhbmQgdGhlIHN1cHBsZW1lbnRhcnkgbWF0ZXJpYWwgZm9yIE1hdXJlYXVkIGV0IGFsLiAyMDE5IFByb2NlZWRpbmdzIG9mIHRoZSBSb3lhbCBTb2NpZXR5IEI6IEJpb2xvZ2ljYWwgU2NpZW5jZXMgaW5mb3JtZWQgRXVyb3BlYW4gZGF0YSBwcm9jZXNzaW5nCi1BZGRpdGlvbmFsIGRhdGEgcHJvY2Vzc2luZyBpbmZvcm1lZCBieSBkYXRhIGl0c2VsZiwgYW5kIGJ5IEZpc2hHbG9iIHBkZiBzdW1tYXJ5IGRvY3VtZW50cwotbGltaXQgdG8gbWF4IDMgbW9udGhzIGZvciBlYWNoIHN1cnZleSB1bml0LCByZXByZXNlbnRhdGl2ZSBvZiBhICdzZWFzb24nIChleGNlcHRpb24gPSBXZXN0IENvYXN0IFVTQSB3aGVyZSBhbGwgNCBtb250aHMgc2FtcGxlZCBjb25zaXN0ZW50bHkpCgojIyMjIkFJIgpgYGB7ciBBSSB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQUkiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkFJIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKLSBNb3N0IGhhdWxzIGluIDYsNyw4Ci0gU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi0gTm8gZHJhbWF0aWMgY2hhbmdlcyBpbiBzcHAgcmljaG5lc3MgCmBgYHtyIEFJIHByb2Nlc3Npbmd9CmFpX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQUkiICYgbW9udGggJWluJSBjKDY6OCksaGF1bF9pZF0pCmBgYAoKCiMjIyNCSVRTCihXZSBoYXZlIHR3byBzdXJ2ZXlzIGZvciBCSVRTLCBxdWFydGVyIDEgYW5kIHF1YXJ0ZXIgNCkKQklUUyAxCgpGcm9tIEZyZWRzdG9uIGV0IGFsLiAyMDIzLCBldmVyeSB5ZWFyIGFmdGVyIDIwMDAgaGFzID40MDAgaGF1bHMgYW5kIG1vc3Qgb2YgdGhlIGVhcmxpZXIgeWVhcnMgYXJlIDw1MCAKCmBgYHtyICBCSVRTMSB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAotS2VlcCBib3RoIG1vbnRocyAoMiwzKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1Db25zaXN0ZW50ICMgb2Ygc3BlY2llcyBhbmQgIyBoYXVscyBhZnRlciAyMDAwCmBgYHtyIEJJVFMxIHByb2Nlc3Npbmd9CmJpdHMxX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIiAmIG1vbnRoICVpbiUgYygyLDMpICYgeWVhciA+IDIwMDAsaGF1bF9pZF0pCmBgYAoKQklUUzQKYGBge3IgIEJJVFM0IHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgotS2VlcCAoMTAsMTEsMTIpCi1TdGFydCBpbiAyMDAwIChzdGFydHMgaW4gMTk5NiwgYnV0IGdhcCBpbiAxOTk3IGFuZCAxOTk4LCBhbmQgMTk5NiBhbGwgaW4gRGVjZW1iZXI7IGFsc28gc3BwIHJpY2huZXNzIGluIGZpcnN0IHN1cnZleSB2ZXJ5IGxvdzsgY29uc2lzdGVudCAjIG9mIGhhdWxzIGFmdGVyIDIwMDApCi1TZWVtaW5nbHkgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKCmBgYHtyIEJJVFM0IHByb2Nlc3Npbmd9CmJpdHM0X2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy00IiAmIG1vbnRoICVpbiUgYygxMDoxMikgJiB5ZWFyID4gMjAwMCxoYXVsX2lkXSkKYGBgCgoKIyMjI0NITCAoQ2hpbGUpCgpgYGB7ciAgQ0hMIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJDSEwiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkNITCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCi1LZWVwICg3LDgsOSkKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiBzcHAgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluICMgaGF1bHMgdGhyb3VnaCB0aW1lCgpgYGB7ciBDSEwgcHJvY2Vzc2luZ30KY2hsX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQ0hMIiAmIG1vbnRoICVpbiUgYyg3OjkpLGhhdWxfaWRdKQpgYGAKCgoKIyMjI0RGTy1ORgoKCmBgYHtyICBERk8tTkYgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCi1LZWVwICgxMCwxMSwxMikKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiBzcHAgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluIGhhdWxpZCB0aHJvdWdoIHRpbWUKCmBgYHtyIERGTy1ORiBwcm9jZXNzaW5nfQpkZm9fbmZfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJERk8tTkYiICYgbW9udGggJWluJSBjKDEwOjEyKSxoYXVsX2lkXSkKYGBgCgoKIyMjI0RGTy1RQ1MKCmBgYHtyICBERk8tUUNTIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKLUtlZXAgKDcsOCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiByaWNobmVzcyBvdmVyIHRpbWUKLU5vIG1ham9yIGNoYW5nZXMgaW4gI2hhdWxzCgpgYGB7ciBERk8tUUNTIHByb2Nlc3Npbmd9CmRmb19xY3NfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJERk8tUUNTIiAmIG1vbnRoICVpbiUgYyg3LDgpLGhhdWxfaWRdKQpgYGAKCgoKIyMjI0VCUwoKLVNhbXBsaW5nIHllYXJzIHByaW9yIHRvIDE5ODQgKGRhdGEgYmVnaW4gaW4gMTk4Mikgd2VyZSBleGNsdWRlZCBmcm9tIGFuYWx5c2lzIGR1ZSB0byBsYXJnZSBhcHBhcmVudCBpbmNyZWFzZXMgaW4gdGhlIG51bWJlciBvZiBzcGVjaWVzIHJlY29yZGVkIGluIHRoZSBmaXJzdCB0d28geWVhcnMuIChCYXR0IGV0IGFsLiAyMDE3KQoKYGBge3IgIEVCUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJFQlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKLUtlZXAgKDYsNyw4KQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1QZXIgQmF0dCBldCBhbC4gMjAxNywgbGltaXQgdG8gPj0gMTk4NAotTm8gY2xlYXIgY2hhbmdlcyAgaW4gcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1ObyBjbGVhciBjaGFuZ2VzIGluICMgaGF1bHMgdGhyb3VnaCB0aW1lCgpgYGB7ciBFQlMgcHJvY2Vzc2luZ30KZWJzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRUJTIiAmIG1vbnRoICVpbiUgYyg2LDcsOCkgJiB5ZWFyID49IDE5ODQsaGF1bF9pZF0pCmBgYAoKCiMjIyNFVkhPRQoKYGBge3IgIEVWSE9FIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwICgxMCwxMSwxMikKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotVmVyeSBsb3cgc2FtcGxpbmcgaW4gMjAxNyAoYW5kIGFsc28gbG93IHJpY2huZXNzKSwgZXhjbHVkZSB0aGlzIHllYXIKCmBgYHtyIEVWSE9FIHByb2Nlc3Npbmd9CmV2aG9lX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiICYgbW9udGggJWluJSBjKDEwLDExLDEyKSAmIHllYXIgIT0gMjAxNyAsaGF1bF9pZF0pCmBgYAoKCiMjIyNGQUxLIChleGNsdWRlZCBmcm9tIGZpbmFsIGRhdGFzZXQpCmBgYHtyIEZBTEsgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKLUtlZXAgRmVicnVhcnkgKDIpIG9ubHkgZnJvbSAyMDA0IG9ud2FyZCAobW9zdCBjb25zaXN0ZW50IHNhbXBsaW5nKQotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHRoaXMgd2lsbCBiZSBmaXhlZCBpbiBuZXh0IHN0ZXAgd2l0aCBzcGF0aWFsIHN0YW5kYXJkaXphdGlvbgoKCmBgYHtyIEZBTEsgcHJvY2Vzc2luZ30KZmFsa19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkZBTEsiICYgbW9udGggJWluJSBjKDIpICYgeWVhciA+PSAyMDA0LCBoYXVsX2lkXSkKYGBgCgoKIyMjI0ZSLUNHRlMKCmBgYHtyICBGUi1DR0ZTIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCi1LZWVwIDksMTAsMTEKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLVNlZWVtaW5nbHkgY29uc2lzdGVudCAjaGF1bHMgdGhyb3VnaCB0aW1lCgoKYGBge3IgRlItQ0dGUyBwcm9jZXNzaW5nfQpmcl9jZ2ZzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSksIGhhdWxfaWRdKQpgYGAKCiMjIyNHSU4gKGV4Y2x1ZGVkIGZyb20gZmluYWwgZGF0YXNldCkKCmBgYHtyICBHSU4gdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotRXhjbHVkZSB0aGlzIHJlZ2lvbiwgbm8gY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHRpbWUKCmBgYHtyIEdJTiBwcm9jZXNzaW5nfQpnaW5faGF1bHNfa2VlcCA8LSBOVUxMCmBgYAoKIyMjI0dNRVgKLUluIHRoZSBHdWxmIG9mIE1leGljbywgd2UgcmVzdHJpY3RlZCBvdXIgYW5hbHlzaXMgdG8gZGF0YSBmcm9tIDE5ODQgLSAyMDAwIChmdWxsIHJhbmdlICAxOTgyLTIwMTQpOyBpZiBhbGwgeWVhcnMgaGFkIGJlZW4gdXNlZCwgdGhlIG51bWJlciBvZiBzaXRlcyBzYW1wbGVkIGluIGF0IGxlYXN0IDg1JSBvZiB5ZWFycyAgd291bGQgZHJvcCBmcm9tIDM5IHRvIDEzLiAoQmF0dCBldCBhbC4gMjAxNykKCkdNRVggRmFsbCAKYGBge3IgIEdNRVggRmFsbCB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDksMTAsMTEKLUluY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUsIHdpbGwgcmVzdHJpY3QgdG8gPC04Ny41IGxvbmdpdHVkZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1TZWVlbWluZ2x5IGNvbnNpc3RlbnQgI2hhdWxzIHRocm91Z2ggdGltZQoKCmBgYHtyIEdNRVgtRmFsbCBwcm9jZXNzaW5nfQpnbWV4X2ZhbGxfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiICYgbW9udGggJWluJSBjKDksMTAsMTEpICYgbG9uZ2l0dWRlX2FkaiA8IC04Ny41LCBoYXVsX2lkXSkKYGBgCgpHTUVYIFN1bW1lcgpgYGB7ciAgR01FWCBTdW1tZXIgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgbW9udGhzIDUsNiw3Ci1JbiBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHRoaXMgd2lsbCBiZSBmaXhlZCBpbiBzcGF0aWFsIHN0YW5kYXJkaXphdGlvbiBzdGVwCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyBiZWZvcmUgMjAwOCBhbmQgMjAwOCBvbndhcmQgdGhyb3VnaCB0aW1lCi1TZWVlbWluZ2x5IGNvbnNpc3RlbnQgI2hhdWxzIHRocm91Z2ggdGltZQotSnVtcCBmcm9tIDIwMDcgdG8gMjAwOCwgd2hlbiBzcGF0aWFsIGZvb3RwcmludCBpbmNyZWFzZXMsIHNvIEkgd2lsbCBvbmx5IHVzZSBkYXRhIGZyb20gYmVmb3JlIDIwMDgKCmBgYHtyIEdNRVgtU3VtbWVyIHByb2Nlc3Npbmd9CmdtZXhfc3VtbWVyX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiICYgbW9udGggJWluJSBjKDUsNiw3KSAmIHllYXIgPDIwMDgsIGhhdWxfaWRdKQpgYGAKCiMjIyNHT0EKYGBge3IgR09BIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJHT0EiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgbW9udGhzIDYsNyw4Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50ICNoYXVscyB0aHJvdWdoIHRpbWUKCmBgYHtyIEdPQSBwcm9jZXNzaW5nfQpnb2FfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHT0EiICYgbW9udGggJWluJSBjKDYsNyw4KSwgaGF1bF9pZF0pCmBgYAoKIyMjI0dSTC1ERQotRnJvbSBCZXVraG9mIGV0IGFsLiAyMDE5LCBhbGwgc3VydmV5cyBpbiBPY3RvYmVyIGFuZCBOb3ZlbWJlcgpgYGB7ciBHUkwtREUgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotTm8gbW9udGhzIGluIGRhdGEgc2V0LCBidXQgYWNjb3JkaW5nIHRvIEJldWtob2YgZXQgYWwuIDIwMTksIGFsbCBzYW1wbGluZyBpbiBPY3RvYmVyIGFuZCBOb3ZlbWJlciBzbyBrZWVwIGFsbCAKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotIyBvZiBoYXVscyBkcm9wcyBiZXR3ZWVuIDE5OTEgYW5kIDE5OTIsIGFuZCBib3RoIDE5OTIgYW5kIDIwMTcgc28gbGltaXQgdG8geWVhcnMgYmV0d2VlbiAoMTk5My0yMDE2KQoKYGBge3IgR1JMLURFIHByb2Nlc3Npbmd9CmdybF9kZV9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIgJiB5ZWFyICVpbiUgYygxOTkzOjIwMTYpLCBoYXVsX2lkXSkKYGBgCgojIyMjR1NMCgpHU0wtTgpgYGB7ciBHU0wtTiB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCA2LDcsOAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi0jIG9mIGhhdWxzIGluIDIwMDUgaXMgaGlnaGVyLCBzbyBzdGFydCBpbiAyMDA2CgpgYGB7ciBHU0wtTiBwcm9jZXNzaW5nfQpnc2xfbl9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1OIiAmIHllYXIgPiAyMDA1LCBoYXVsX2lkXSkKYGBgCgpHU0wtUwpgYGB7ciBHU0wtUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCA4LDksMTAKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBHU0wtUyBwcm9jZXNzaW5nfQpnc2xfc19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1TIiAmIG1vbnRoICVpbiUgYyg4OjEwKSwgaGF1bF9pZF0pCmBgYAoKIyMjI0lDRS1HRlMKCmBgYHtyIElDRS1HRlMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDIsMyw0Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgSUNFLUdGUyBwcm9jZXNzaW5nfQppY2VfZ2ZzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIgJiBtb250aCAlaW4lIGMoMjo0KSwgaGF1bF9pZF0pCmBgYAoKIyMjI0lFLUlHRlMKCmBgYHtyIElFLUlHRlMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDEwLDExLDEyCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSBhZnRlciAyMDA0IChzYW1wbGVkIGZhciBlYXN0IGluIDIwMDMgYW5kIDIwMDQpCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBJRS1JR0ZTIHByb2Nlc3Npbmd9CmllX2lnZnNfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIiAmIG1vbnRoICVpbiUgYygxMDoxMikgJiB5ZWFyICA+IDIwMDQsIGhhdWxfaWRdKQpgYGAKCiMjIyNJUy1NT0FHIChleGNsdWRlZCBmcm9tIGZpbmFsIGRhdGFzZXQpCmBgYHtyIElTLU1PQUcgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1TYW1wbGluZyB0b28gc2NhdHRlcmVkIG92ZXIgdGltZSwgZXhjbHVkaW5nCgpgYGB7ciBJUy1NT0FHIHByb2Nlc3Npbmd9CmlzX21vYWdfaGF1bHNfa2VlcCA8LSBOVUxMCmBgYAoKIyMjI01FRElUUwpgYGB7ciBNRURJVFMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCAgYWxsIHN1cnZleXMgaW4gcXVhcnRlciAyCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgTUVESVRTIHByb2Nlc3Npbmd9Cm1lZGl0c19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsIGhhdWxfaWRdKQpgYGAKCgojIyMjTVJUIChleGNsdWRlZCBmcm9tIGZpbmFsIGRhdGFzZXQpCmBgYHtyIE1SVCB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJNUlQiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1TYW1wbGluZyBpbmNvbnNpc3RlbnQsIGV4Y2x1ZGUgY29tcGxldGVseQoKYGBge3IgTVJUIHByb2Nlc3Npbmd9Cm1ydF9oYXVsc19rZWVwIDwtIE5VTEwKYGBgCgojIyMjTkFNCgpgYGB7ciBOQU0gdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCBzdXJ2ZXlzIGluIDEgYW5kIDIgKG1vc3QgY29uc2lzdGVudGx5IHNhbXBsZWQpCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgZXhjZXB0IGZvciAxOTk4IChleGNsdWRlKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzIGV4Y2VwdCBmb3IgMTk5OCAoZXhjbHVkZSkKCmBgYHtyIE5BTSBwcm9jZXNzaW5nfQpuYW1faGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOQU0iICYgbW9udGggJWluJSBjKDEsMikgJiB5ZWFyICE9IDE5OTgsIGhhdWxfaWRdKQpgYGAKCgojIyMjTkVVUwoKCk5FVVMgU3ByaW5nCmBgYHtyIE5FVVMtU3ByaW5nIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDMsNCw1IG1vbnRocwotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gc3RhbmRhcmRpemF0aW9uIHN0ZXAKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIChlc3BlY2lhbGx5IGFmdGVyIDg3LCBzaG91bGQgYmUgZml4ZWQgd2l0aCBzdGFuZGFyZGl6YXRpb24gc3RlcCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscyAoZXNwZWNpYWxseSBhZnRlciA4MSwgc2hvdWxkIGJlIGZpeGVkIHdpdGggc3RhbmRhcmRpemF0aW9uIHN0ZXApCgpgYGB7ciBORVVTLVNwcmluZyBwcm9jZXNzaW5nfQojY2FsY3VsYXRlIHdndF9jcHVlIChrbV4yIGF2ZyBmcm9tIHNlYW4gTHVjZXkpIGFuZCB3Z3RfaCAoYWxsIGJpb21hc3MgdmFsdWVzIGNhbGlicmF0ZWQgdG8gc3RhbmRhcmQgcHJlIDIwMDkgMzAgbWludXRlIHRvdykKRmlzaEdsb2IuMTB5ZWFyLnNwcFtzdXJ2ZXkgPT0gIk5FVVMiLCB3Z3RfaCA6PSB3Z3QvMC41XVtzdXJ2ZXkgPT0gIk5FVVMiLCB3Z3RfY3B1ZSA6PSB3Z3QvMC4wMzg0XVtzdXJ2ZXkgPT0gIk5FVVMiLCBudW1faCA6PSBudW0vMC41XVtzdXJ2ZXkgPT0gIk5FVVMiLCBudW1fY3B1ZSA6PSBudW0vMC4wMzg0XQoKCiNhbHNvLCBmb3Igbm9ydGhlYXN0LCB3ZSBhcmUgZ29pbmcgdG8gZGVsZXRlIGFueSBoYXVscyBiZWZvcmUgMjAwOSB0aGF0IGFyZSBvdXRzaWRlIG9mICsvLSA1IG1pbnV0ZXMgb2YgMzAgbWludXRlcyBhbmQgMjAwOSBmb3J3YXJkIHRoYXQgYXJlIG91dHNpZGUgb2YgKy8tIDUgbWludXRlcyBvZiAyMCBtaW51dGVzCm5ldXNfc3ByaW5nX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1soKHN1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIgJiBtb250aCAlaW4lIGMoMzo1KSAmIHllYXIgPCAyMDA5ICYgKGhhdWxfZHVyID4gMC40MiAmIGhhdWxfZHVyIDwgMC41OCkpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIiAmIG1vbnRoICVpbiUgYygzOjUpICYgeWVhciA+PSAyMDA5ICYgKGhhdWxfZHVyID4gMC4yNSAgJiBoYXVsX2R1ciA8IDAuNDIpKSksIGhhdWxfaWRdKQoKCmBgYAoKTkVVUyBGYWxsCgpgYGB7ciBORVVTLUZhbGwgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCA5LDEwLDExIG1vbnRocwotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gc3RhbmRhcmRpemF0aW9uIHN0ZXAKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIChlc3BlY2lhbGx5IGFmdGVyIDg0LCBzaG91bGQgYmUgZml4ZWQgd2l0aCBzdGFuZGFyZGl6YXRpb24gc3RlcCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscyAoZXNwZWNpYWxseSBhZnRlciA4NSwgc2hvdWxkIGJlIGZpeGVkIHdpdGggc3RhbmRhcmRpemF0aW9uIHN0ZXApCgpgYGB7ciBORVVTLUZhbGwgcHJvY2Vzc2luZ30KCiNhbHNvLCBmb3Igbm9ydGhlYXN0LCB3ZSBhcmUgZ29pbmcgdG8gZGVsZXRlIGFueSBoYXVscyBiZWZvcmUgMjAwOSB0aGF0IGFyZSBvdXRzaWRlIG9mICsvLSA1IG1pbnV0ZXMgb2YgMzAgbWludXRlcyBhbmQgMjAwOSBmb3J3YXJkIHRoYXQgYXJlIG91dHNpZGUgb2YgKy8tIDUgbWludXRlcyBvZiAyMCBtaW51dGVzCm5ldXNfZmFsbF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbKChzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIiAmIG1vbnRoICVpbiUgYyg5LDEwLDExKSAmIHllYXIgPCAyMDA5ICYgKGhhdWxfZHVyID4gMC40MiAmIGhhdWxfZHVyIDwgMC41OCkpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSkgJiB5ZWFyID49IDIwMDkgJiAoaGF1bF9kdXIgPiAwLjI1ICAmIGhhdWxfZHVyIDwgMC40MikpKSwgaGF1bF9pZF0pCmBgYAoKIyMjI05JR0ZTCk5vcnRoZXJuIElyZWxhbmQKClNwcmluZyBOb3J0aGVybiBJcmVsYW5kIChxdWFydGVyIDEpCgpgYGB7ciBOSUdGUyBzcHJpbmcgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDIsMyw0IG1vbnRocwotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gc3RhbmRhcmRpemF0aW9uIHN0ZXAKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKCmBgYHtyIE5JR0ZTIDEgcHJvY2Vzc2luZ30KbmlnZnNfMV9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiICYgbW9udGggJWluJSBjKDIsMyw0KSwgaGF1bF9pZF0pCmBgYAoKClNwcmluZyBOb3J0aGVybiBJcmVsYW5kIChxdWFydGVyIDEpCgpgYGB7ciBOSUdGUyBmYWxsIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCAxMCwxMSBtb250aHMKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiBzdGFuZGFyZGl6YXRpb24gc3RlcAotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgTklHRlMgNCBwcm9jZXNzaW5nfQpuaWdmc180X2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIgJiBtb250aCAlaW4lIGMoMTAsMTEpLCBoYXVsX2lkXSkKYGBgCgojIyMjTm9yLUJUUwoKT0cgRklTSEdMT0IgaW5jbHVkZXMgTm9yLUJUUy0xIGFzIHdlbGwsIGJ1dCB0aGlzIHdhcyBub3Qgc2hhcmVkIGJ5IEwuIFBlY3VjaGV0LCBhbmQgdGhlcmVmb3JlIGlnbm9yZWQKCk5vci1CVFMtMwpgYGB7ciBOb3ItQlRTLTN9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDgsOSwxMAotU29tZXdoYXQgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLU51bWJlciBvZiBoYXVscyBpcyB2YXJpYWJsZSwgYnV0IG5vIGNsZWFyIHllYXJzIHRvIGV4Y2x1ZGUKLUxhdXJlbmUgUGVjdWNoZXQgKFUgVHJvbXNvKSB0b2xkIHVzIHRoYXQgb25seSBzdXJ2ZXlzIDIwMDQgYW5kIG9ud2FyZHMgd29yayBmb3IgYmlvZGl2ZXJzaXR5IGFuYWx5c2VzCgoKYGBge3IgTm9yLUJUUy0zIHByb2Nlc3Npbmd9Cm5vcl9idHNfM19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5vci1CVFMtMyIgJiBtb250aCAlaW4lIGMoODoxMCkgJiB5ZWFyID49IDIwMDQsIGhhdWxfaWRdKQpgYGAKCiMjIyNOUy1JQlRTCgpOUy1JQlRTLTEKYGBge3IgTlMtSUJUUy0xfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAxLDIsMwotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLUxpbmVhciBpbmNyZWFzZSBpbiByaWNobmVzcywgY3V0b2ZmIG9uICMgaGF1bHMgbW9yZSBjbGVhcgotTGluZWFyIGluY3JlYXNlLCBidXQgc29tZXdoYXQgY2xlYXIgYnJlYWsgYmV0d2VlbiBsYXRlIDcwcyBhbmQgbWlkLTgwcywgb25seSBrZWVwIGhhdWxzIGFmdGVyIDE5ODQKCgpgYGB7ciBOUy1JQlRTLTEgcHJvY2Vzc2luZ30KbnNfaWJ0c18xX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIiAmIG1vbnRoICVpbiUgYygxOjMpICYgeWVhciA+PSAxOTg0LCBoYXVsX2lkXSkKYGBgCgpOUy1JQlRTLTMKYGBge3IgTlMtSUJUUy0zfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA3LDgsOQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLUNvbnNpc3RlbnQgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1FYXJseSB5ZWFycyBsb3dlciAjIGhhdWxzLCB3aWxsIHN0YXJ0IGF0IDE5OTgKCgpgYGB7ciBOUy1JQlRTLTMgcHJvY2Vzc2luZ30KbnNfaWJ0c18zX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIiAmIG1vbnRoICVpbiUgYyg3OjkpICYgeWVhciA+PSAxOTk4LCBoYXVsX2lkXSkKYGBgCgoKIyMjI05aCgpOWi1DSEFUCgpgYGB7ciBOWi1DSEFUfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDEyLDEsMiAoTk9URSBUSEFUIFRISVMgTlotQ0hBVCBTVVJWRVkgQ1JPU1NFUyBZRUFSLCBTTyBXRSBBTFJFQURZIExVTVBFRCAxMiB3aXRoIE5FWFQgeWVhcikKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzIGFmdGVyIDE5OTUKCgpgYGB7ciBOWi1DSEFUIHByb2Nlc3Npbmd9CgoKbnpfY2hhdF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiICYgbW9udGggJWluJSBjKDEyLDEsMikgJiB5ZWFyID49IDE5OTUsIGhhdWxfaWRdKQoKYGBgCgpOWi1FQ1NJCgpgYGB7ciBOWi1FQ1NJfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDQsNSw2Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwotR2FwIGJldHdlZW4gMTk5NSBhbmQgMjAwNSwgYnV0IHdlIGhhdmUgMTAgdG90YWwgeWVhcnMgc28gd2UnbGwga2VlcCBmb3Igbm93CgoKYGBge3IgTlotRUNTSSBwcm9jZXNzaW5nfQpuel9lY3NpX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIgJiBtb250aCAlaW4lIGMoNCw1LDYpLCBoYXVsX2lkXSkKYGBgCgpOWi1TVUJBCgpgYGB7ciBOWi1TVUJBfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDExIGFuZCAxMgotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1GYXIgbW9yZSBoYXVscyBpbiAxOTkwcywgdGhlc2UgZWFybHkgc2FtcGxpbmcgeWVhcnMgd2lsbCBiZSBleGNsdWRlZCAoc3RhcnQgaW4gMjAwMCkKCgpgYGB7ciBOWi1TVUJBIHByb2Nlc3Npbmd9Cm56X3N1YmFfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1TVUJBIiAmIG1vbnRoICVpbiUgYygxMSwxMikgJiB5ZWFyID49IDIwMDAsIGhhdWxfaWRdKQpgYGAKCk5aLVdDU0kKCmBgYHtyIE5aLVdDU0l9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMyw0Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLUxpbmVhciBkZWNyZWFzZSBpbiAjIG9mIGhhdWxzIHRocm91Z2ggdGltZSwgbGVhdmUgb3V0IGZpcnN0IHR3byB5ZWFycyB3aXRoIGhpZ2hlc3QgIyBoYXVscyAoPj0gMTk5NSkKCgpgYGB7ciBOWi1XQ1NJIHByb2Nlc3Npbmd9Cm56X3djc2lfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIiAmIG1vbnRoICVpbiUgYygzLDQpICYgeWVhciA+PSAxOTk1LCBoYXVsX2lkXSkKYGBgCgojIyMjUFQtSUJUUwpQVC1JQlRTCmBgYHtyIFBULUlCVFN9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgOSwxMCwxMQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKCgpgYGB7ciBQVC1JQlRTIHByb2Nlc3Npbmd9CnB0X2lidHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJQVC1JQlRTIiAmIG1vbnRoICVpbiUgYyg5LDEwLDExKSwgaGF1bF9pZF0pCmBgYAoKIyMjI1JPQ0tBTEwKCmBgYHtyIFJPQ0tBTEx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgOCw5Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKCmBgYHtyIFJPQ0tBTEwgcHJvY2Vzc2luZ30Kcm9ja2FsbF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiICYgbW9udGggJWluJSBjKDgsOSksIGhhdWxfaWRdKQpgYGAKCiMjIyNTLUdFT1JHCgpgYGB7ciBTLUdFT1JHfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDEgYW5kIDIKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyBleGNlcHQgZm9yIDIwMDMsIHdpbGwgYmUgZXhjbHVkZWQKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscywgZXhjZXB0IGZvciAyMDEyLCB3aWxsIGJlIGV4Y2x1ZGVkCgoKYGBge3IgU0dlb3JnZSBwcm9jZXNzaW5nfQpzX2dlb3JnX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIgJiBtb250aCAlaW4lIGMoMSwyKSAmICEoeWVhciAlaW4lIGMoMjAwMywyMDEyKSksIGhhdWxfaWRdKQpgYGAKCiMjIyNTQ1MKClNwcmluZwpgYGB7ciBTQ1MtU1BSSU5HfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDIsMyw0Ci1JbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lIChub3J0aGVybiBsYXRpdHVkZXMgb25seSBzYW1wbGVkIGluIGVhcmx5IHllYXJzKSwgb25seSBpbmNsdWRlIGxvbmdpdHVkZXMgPCAtNjIgYW5kIGxhdGl0dWRlcyA8IDQ1LjUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1OdW1iZXIgb2YgaGF1bHMgaXMgdmFyaWFibGUsIGV4Y2x1ZGUgc3VwZXIgbG93IGFuZCBoaWdoIG51bWJlcnMgKDE5ODUsMTk5NCwyMDE1LDIwMTkpCgoKYGBge3Igc2NzX3NwcmluZyBwcm9jZXNzaW5nfQpzY3Nfc3ByaW5nX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIgJiBtb250aCAlaW4lIGMoMiwzLDQpICYgISh5ZWFyICVpbiUgYygxOTg1LDE5OTQsMjAxNSwyMDE5KSkgJiBsb25naXR1ZGVfYWRqIDwgLTYyICYgbGF0aXR1ZGUgPCA0NS41LCBoYXVsX2lkXSkKYGBgCgpTVU1NRVIKYGBge3IgU0NTLVNVTU1FUn0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA2LDcsOAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGluY3JlYXNlcyBsaW5lYXJseSwgbm90IGEgY2xlYXIgYnJlYWsgcG9pbnQsIHVzaW5nIGJyZWFrcG9pbnQgZnJvbSAjIG9mIGhhdWxzLCBidXQgd2lsbCBleGNsdWRlIDIwMTAgd2hpY2ggaGFzIGEgdmVyeSBoaWdoIHJpY2huZXNzCi0jIEhhdWxzIGluY3JlYXNlcyBsaW5lYXJseSBmcm9tIH4xMjAgaW4gMTk3MCB0byB+MjIwIGluIDIwMjAsIG5vdCBhIGNsZWFyIGJyZWFrcG9pbnQsIGJ1dCB3aWxsIGdvIHdpdGggMTk4NiBiZWNhdXNlIHRoZXJlIGlzIGEganVtcCBiZXR3ZWVuIDg1IGFuZCA4NgotR2VhciBjaGFuZ2UgaW4gMTk4MyAoRWxsaW5nc2VuIGV0IGFsLiAyMDE1KQoKCmBgYHtyIHNjc19zdW1tZXIgcHJvY2Vzc2luZ30Kc2NzX3N1bW1lcl9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiICYgbW9udGggJWluJSBjKDYsNyw4KSAmIHllYXIgPj0gMTk4NiAmIHllYXIgIT0gMjAxMCwgaGF1bF9pZF0pCmBgYAoKCiMjI1NFVVMKCgpTcHJpbmcKCmBgYHtyIFNFVVMtc3ByaW5nfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgNCw1LDYKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1Db25zaXN0ZW50IHJpY2huZXNzIHRocm91Z2ggdGltZQotIyBIYXVscyBsb3cgaW4gMTk4OSBhbmQgMjAxOCwgd2lsbCBleGNsdWRlCgpgYGB7ciBzZXVzX3NwcmluZyBwcm9jZXNzaW5nfQpzZXVzX3NwcmluZ19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIiAmIG1vbnRoICVpbiUgYyg0LDUsNikgJiB5ZWFyICE9IDE5ODkgJiB5ZWFyICE9IDIwMTgsIGhhdWxfaWRdKQpgYGAKCgpTdW1tZXIKCmBgYHtyIFNFVVMtc3VtbWVyfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgNyw4Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgbG93IGluIGZpcnN0IHllYXIsIG90aGVyd2lzZSBva2F5LCBqdXN0IGV4Y2x1ZGUgZmlyc3QgeWVhciAoMTk4OSkKCmBgYHtyIHNldXNfc3VtbWVyIHByb2Nlc3Npbmd9CnNldXNfc3VtbWVyX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiICYgbW9udGggJWluJSBjKDcsOCkgJiB5ZWFyICE9IDE5ODksIGhhdWxfaWRdKQpgYGAKCgpGYWxsCgpgYGB7ciBTRVVTLWZhbGx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDksMTAsMTEKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQotIyBIYXVscyBsb3cgaW4gZmlyc3QgeWVhciwgb3RoZXJ3aXNlIG9rYXksIGp1c3QgZXhjbHVkZSBmaXJzdCB5ZWFyICgxOTg5KQoKCmBgYHtyIHNldXNfZmFsbCBwcm9jZXNzaW5nfQpzZXVzX2ZhbGxfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiICYgbW9udGggJWluJSBjKDksMTAsMTEpICYgeWVhciAhPSAxOTg5LCBoYXVsX2lkXSkKYGBgCgoKIyMjI1NXQy1JQlRTCgpTY290bGFuZCBTaGVsZiBTZWEKClNXQy1JQlRTIDEKCmBgYHtyIFNXQy1JQlRTLTF9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMSwyLDMKLVNvbWV3aGF0IGluY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUsIGJ1dCB0aGlzIHNob3VsZCBiZSBhZGRyZXNzZWQgaW4gc3BhdGlhbCBzdGFuZGFyZGl6YXRpb24gcHJvY2VkdXJlIAotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgY29uc2lzdGVudCBleGNlcHQgbG93IGluIDE5OTUsIGp1c3QgZXhjbHVkZSAxOTk1CgoKCmBgYHtyIHN3Yy1pYnRzLTEgcHJvY2Vzc2luZ30Kc3djX2lidHNfMV9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiICYgbW9udGggJWluJSBjKDEsMiwzKSAmIHllYXIgIT0gMTk5NSwgaGF1bF9pZF0pCmBgYAoKU1dDLUlCVFMgNAoKYGBge3IgU1dDLUlCVFMtNH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAxMCwxMSwxMgotU29tZXdoYXQgaW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSAoc291dGhlcm4gbGF0aXR1ZGVzIG9ubHkgc2FtcGxlZCBpbiBlYXJseSB5ZWFycyksIGJ1dCB0aGlzIHNob3VsZCBiZSBhZGRyZXNzZWQgaW4gc3BhdGlhbCBzdGFuZGFyZGl6YXRpb24gcHJvY2VkdXJlIAotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUgKGVzcGVjaWFsbHkgYWZ0ZXIgbWlkIDkwcykKLSMgSGF1bHMgY29uc2lzdGVudCBleGNlcHQgbG93IGJlZm9yZSAxOTk1IGFuZCBsb3cgaW4gMjAxMywgZXhjbHVkZSB0aGVzZQoKCmBgYHtyIHN3Yy1pYnRzLTQgcHJvY2Vzc2luZ30Kc3djX2lidHNfNF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiICYgbW9udGggJWluJSBjKDEwLDExLDEyKSAmIHllYXIgIT0gMTk5NSAmIHllYXIgPj0gMTk5NSwgaGF1bF9pZF0pCmBgYAoKIyMjI1dDQU5OCgoKYGBge3IgV0NBTk59CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotSGVyZSwgb25lIGV4Y2VwdGlvbiwgd2lsbCB1c2UgZm91ciBtb250aHMgKDYsNyw4LDkpIGJlY2F1c2UgYWxsIHNhbXBsZWQgY29uc2lzdGVudGx5LCBhbmQgbG93ZXIgbGF0aXR1ZGUgYXJlYXMgc2FtcGxlZCBsYXRlciBpbiB0aGUgc3VtbWVyIGNvbnNpc3RlbnRseQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCgoKYGBge3Igd2Nhbm4gcHJvY2Vzc2luZ30Kd2Nhbm5fa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJXQ0FOTiIgJiBtb250aCAlaW4lIGMoNjo5KSwgaGF1bF9pZF0pCmBgYAoKIyMjI1dDVFJJCi1FeGNsdWRlIGJlY2F1c2Ugb25seSAxMCB5ZWFycyBhbmQgb3ZlcmxhcHMgc29tZXdoYXQgd2lpdGggV0NBTk4KCmBgYHtyIHdjdHJpIHByb2Nlc3Npbmd9CndjdHJpX2tlZXAgPC0gTlVMTApgYGAKCgojIyMjWkFGCgpBVEwKYGBge3IgWkFGIEFUTH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotSW5jbHVkZSAxLDIsMwotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lIGFmdGVyIDE5OTEKCgpgYGB7ciB6YWYgYXRsIHByb2Nlc3Npbmd9CnphZl9hdGxfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJaQUYtQVRMIiAmIG1vbnRoICVpbiUgYygxOjMpICYgeWVhciA+PSAxOTkxLCBoYXVsX2lkXSkKYGBgCgoKSU5ECmBgYHtyIFpBRiBJTkR9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUluY2x1ZGUgNCw1LDYKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQotIyBIYXVscyBjb25zaXN0ZW50IGJlZm9yZSAyMDAxLCBhbmQgdGhlbiBhbHNvIGluIDIwMDUgYW5kIDIwMDktMjAxMAoKCmBgYHtyIHphZiBpbmQgcHJvY2Vzc2luZ30KemFmX2luZF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiICYgbW9udGggJWluJSBjKDQ6NikgJiB5ZWFyICVpbiUgYygxOTg1OjIwMDEsMjAwNSwgMjAwOSwyMDEwKSwgaGF1bF9pZF0pCmBgYAoKCiMjIyNDb21iaW5lIGFsbCBsaXN0cyB0aGF0IGhhdmUgX2tlZXAKYGBge3IgY29tYmluZSBsaXN0c30KI2FsbCBvYmplY3RzIHdpdGggX2tlZXAKbGlzdF9vYmogPC0gbHMocGF0dGVybiA9ICJfa2VlcCIpCgojY29tYmluZQpmaXNoZ2xvYl9oYXVsaWRzX3RvX2tlZXAgPC0gdW5saXN0KGxhcHBseShsaXN0X29iaiwgZ2V0KSkgIzIyOTg5NCBoYXVscyAoU3RhcnRlZCB3aXRoIDI3ODQwNSkKCkZpc2hHbG9iLjEweWVhci5zcHBfbWFudWFsY2xlYW4gPC0gRmlzaEdsb2IuMTB5ZWFyLnNwcFtoYXVsX2lkICVpbiUgZmlzaGdsb2JfaGF1bGlkc190b19rZWVwLF0KCiNSZXF1aXJlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgZm9yIGFsbCBvYnNlcnZhdGlvbnMKRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhbiA8LSBGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuW2NvbXBsZXRlLmNhc2VzKEZpc2hHbG9iLjEweWVhci5zcHBfbWFudWFsY2xlYW5bLC4obGF0aXR1ZGUsIGxvbmdpdHVkZSldKV0gI2NoZWNrIHRoYXQgdGhpcyB3b3JrcwoKI2Fub3RoZXIgY2hlY2sgZm9yICMgeWVhcnMgc2FtcGxlZAojbmV3IHJvdyBmb3IgdG90YWwgbnVtYmVyIG9mIHllYXJzIHNhbXBsZWQKRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhblsseWVhcnNfc2FtcGxlZCA6PSBsZW5ndGgodW5pcXVlKHllYXIpKSwuKHN1cnZleV91bml0KV0KVmlldyh1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhblssLihzdXJ2ZXlfdW5pdCwgeWVhcnNfc2FtcGxlZCldKSkKCiNzYXZlCnNhdmVSRFMoRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhbiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGEiLCJjbGVhbmVkIiwiRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhbi5yZHMiKSkKCmBgYAoKCiMjIyNTb21lIHN1cnZleXMgc2FtcGxlIHRocm91Z2ggZW5kIG9mIHllYXIsIGZpeCB0aGVzZQotTk9URSBUSEFUIFRISVMgTlotQ0hBVCBTVVJWRVkgQ1JPU1NFUyBZRUFSLCBTTyBMVU1QIDEgYW5kIDIgd2l0aCBwcmV2aW91cyB5ZWFyCg==
=======
LS0tCnRpdGxlOiAiUHJlcGFyZSBGaXNoR2xvYiBEYXRhc2V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBab8OrIEouIEtpdGNoZWwKZGF0ZTogT2N0b2JlciAxMSwgMjAyMwotLS0KClNjcmlwdCAxIGZvciBLaXRjaGVsIGV0IGFsLiAyMDIzIGluIHByZXAgdGF4b25vbWljIGRpdmVyc2l0eSBtYW51c2NyaXB0LgoKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzcCkKbGlicmFyeShyYXN0ZXIpCiNsaWJyYXJ5KHJnZW9zKQpsaWJyYXJ5KHJnYmlmKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KHJhc3RlclZpcykKbGlicmFyeShjb25jYXZlbWFuKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoZGF0YS50YWJsZSkKc2V0LnNlZWQoMSkKCmBgYAoKUHVsbCBpbiBjb21waWxlZCBhbmQgY2xlYW5lZCBkYXRhIGZyb20gRmlzaEdsb2IgZG93bmxvYWRlZCBvbiBOb3ZlbWJlciAyOCAyMDIyIChWIDEuNSkuIFRoaXMgaXMgdHlwaWNhbGx5IGNvbXBpbGVkIGJ5IERyLiBBdXJvcmUgTWF1cmVhdWQuIFRoaXMgaW5jbHVkZXMgcHVibGljIGFuZCBwcml2YXRlIGRhdGEgYW5kIHRoZXJlZm9yZSBsaW5rIGNhbm5vdCBiZSBzaGFyZWQuIEhvd2V2ZXIgd2l0aCBlZGl0aW5nIHlvdSBjYW4gcnVuIGFuYWx5c2VzIGZvciBwdWJsaWMgdHJhd2wgc3VydmV5cy4KCnxTdXJ2ZXkgY29kZXxTdXJ2ZXkgbmFtZSBzaG9ydHxTdXJ2ZXkgbmFtZSBsb25nfEFnZW5jeXxSZWdpb258QWNjZXNzfFByb3ZpZGVyL2xpbmsgdG8gYWNjZXNzfEluY2x1c2lvbgp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfEFJICB8QWxldXRpYW4gSXNsYW5kc3xBbGV1dGlhbiBJc2xhbmRzfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8QklUUy0xICB8QmFsdGljIFNlYSBRMXxCYWx0aWMgU2VhIFF1YXJ0ZXIgMXxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxCSVRTLTQgIHxCYWx0aWMgU2VhIFE0fEJhbHRpYyBTZWEgUXVhcnRlciA0fEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfENITCAgfENoaWxlfENoaWxlfFVuaXZlcnNpZGFkIGRlIENvbmNlcGNpw7NuLCBDaGlsZXxTb3V0aCBBbWVyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxEYW5pZWxhIFllcHNvbiBkYW5pZWxhLnllcHNlbkBnbWFpbC5jb20gYW5kIEx1aXMgQ3ViaWxsb3MgbHVjdWJpbGxvc0BnbWFpbC5jb218SW5jbHVkZWR8CnxDT0x8IENvbG9tYmlhfCBDb2xvbWJpYW4gQ2FyaWJiZWFufFVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlIENvbG9tYmlhfFNvdXRoIEFtZXJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fENhbWlsbyBCLiBHYXJjaWEgY2JnYXJjaWFyQHVuYWwuZWR1LmNvfFRvbyBmZXcgeWVhcnN8CnxERk8tSFMgIHxIZWNhdGUgU3RyYWl0fEhlY2F0ZSBTdHJhaXR8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3xDYW5hZGF8UHVibGljfGh0dHBzOi8vb3Blbi5jYW5hZGEuY2EvZGF0YS9lbi9kYXRhc2V0Lzc4MGExYzAyLTFmOWMtNDk5NC1iYzcwLWEwZTllZjhlMzk2OCBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxUb28gZmV3IHllYXJzfAp8REZPLU5GICB8TmV3Zm91bmRsYW5kfE5ld2ZvdW5kbGFuZHxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfCBDYW5hZGF8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fE1hcmlhbm8gS29lbi1BbG9uc28gbWFyaWFuby5rb2VuLWFsb25zb0BkZm8tbXBvLmdjLmNhfEluY2x1ZGVkfAp8REZPLVFDUyAgfFF1ZWVuIENoYXJsb3R0ZSBTb3VuZHxRdWVlbiBDaGFybG90dGUgU291bmR8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3xDYW5hZGF8UHVibGljfGh0dHBzOi8vb3Blbi5jYW5hZGEuY2EvZGF0YS9lbi9kYXRhc2V0L2EyNzhkMWFmLWQ1NjctNDk2NC1hMTA5LWFlMWU4NGNiZDI0YSBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfERGTy1TT0cgIHxTdHJhaXQgb2YgR2VvcmdpYXxTdHJhaWdodCBvZiBHZW9yZ2lhfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC9kODgwYmExOC04NzkwLTQxYTItYmY3My1lOTI0NzM4MDc1OWIgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8IFRvbyBmZXcgeWVhcnN8CnxERk8tV0NIRyAgfFdlc3QgQ29hc3QgSGFpZGEgR3dhaWl8V2VzdCBDb2FzdCBIYWlkYSBHd2FpaXxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfENhbmFkYXxQdWJsaWN8aHR0cHM6Ly9vcGVuLmNhbmFkYS5jYS9kYXRhL2VuL2RhdGFzZXQvNWVlMzA3NTgtYjFkNi00OWZlLThjNGUtNTEzNmY0YjM5YWQxIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfCBUb28gZmV3IHllYXJzfAp8REZPLVdDVkkgIHxXZXN0IENvYXN0IFZhbmNvdXZlciBJc2xhbmR8V2VzdCBDb2FzdCBWYW5jb3V2ZXIgSXNsYW5kfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC81NTdlNDJhZS0wNmZlLTQyNmQtODI0Mi1jMzEwNzY3MGIxZGUgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8IFRvbyBmZXcgeWVhcnN8CnxFQlMgIHxFYXN0ZXJuIEJlcmluZyBTZWF8RWFzdGVybiBCZXJpbmcgU2VhfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8RVZIT0UgIHxCYXkgb2YgQmlzY2F5fEJheSBvZiBCaXNjYXl8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8RkFMSyAgfEZhbGtsYW5kIElzbGFuZHN8RmFsa2xhbmQgSXNsYW5kc3xGYWxrbGFuZCBJc2xhbmRzIEZpc2hlcmllcyBEZXBhcnRtZW50fFNvdXRoZXJuIE9jZWFufFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxBbGV4YW5kZXIgQXJraGlwa2luIGFhcmtoaXBraW5AZmlzaGVyaWVzLmdvdi5mayBhbmQgSm9yZ2UgUmFtb3MgamVyYW1vc0BmaXNoZXJpZXMuZ292LmZrfCBFeGNsdWRlZCBhZnRlciBzcGF0aWFsIHRlbXBvcmFsIHN0YW5kYXJkaXphdGlvbiBpbiBuZXh0IHNjcmlwdHwKfEZSLUNHRlMgIHxFbmdsaXNoIENoYW5uZWx8RW5nbGlzaCBDaGFubmVsfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfEdJTiAgfEd1aW5lYXxHdWluZWF8TmF0aW9uYWwgQ2VudGVyIG9mIEZpc2hlcmllcyBTY2llbmNlcyBvZiBCb3Vzc291cmEsIENvbmFrcnksIFJlcHVibGljIG9mIEd1aW5lYXxBZnJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fE1vaGFtbWVkIExhbWluZSBDYW1hcmEgbWxjYW1hcmEua2VubmVkeUBnbWFpbC5jb218SW5jb25zaXN0ZW50IHNhbXBsaW5nIHRocm91Z2ggc3BhY2UgYW5kIHRpbWV8CnxHTUVYLVN1bW1lciAgfEd1bGYgb2YgTWV4aWNvIFN1bW1lcnxHdWxmIG9mIE1leGljbyBTdW1tZXJ8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxHTUVYLUZhbGwgIHxHdWxmIG9mIE1leGljbyBGYWxsfEd1bGYgb2YgTWV4aWNvIEZhbGx8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxHT0EgIHxHdWxmIG9mIEFsYXNrYXxHdWxmIG9mIEFsYXNrYXxOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbnwgVVNBfFB1YmxpY3xEaXNNQVA6IGh0dHBzOi8vYXBwcy1zdC5maXNoZXJpZXMubm9hYS5nb3YvZGlzbWFwLyBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfEdSTC1ERSAgfEdyZWVubGFuZHxHcmVlbmxhbmR8VGh1ZW5lbiBJbnN0aXR1dGUgb2YgU2VhIEZpc2hlcmllc3xFdXJvcGV8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fEthcmwtTWljaGFlbCBXZXJuZXIga2FybC1taWNoYWVsLndlcm5lckB0aHVlbmVuLmRlfEluY2x1ZGVkfAp8R1NMLU4gIHxOIEd1bGYgb2YgU3QuIExhd3JlbmNlfE5vcnRoZXJuIEd1bGYgb2YgU3QuIExhd3JlbmNlfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xTZWUgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MCBmb3Igc3BlY2lmaWMgREZPIGxpbmtzfEluY2x1ZGVkfAp8R1NMLVMgIHxTIEd1bGYgb2YgU3QuIExhd3JlbmNlfFNvdXRoZXJuIEd1bGYgb2YgU3QuIExhd3JlbmNlfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC8xOTg5ZGUzMi1iYzVkLWM2OTYtODc5Yy01NGQ0MjI0MzhlNjQgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxJQ0UtR0ZTICB8SWNlbGFuZHxJY2VsYW5kfE1hcmluZSBhbmQgRnJlc2h3YXRlciBSZXNlYXJjaCBJbnN0aXR1dGUsIEljZWxhbmR8RXVyb3BlfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxKw7NuIFPDs2xtdW5kc3NvbiBqb24uc29sbXVuZHNzb25AaGFmb2d2YXRuLmlzfEluY2x1ZGVkfAp8SUUtSUdGUyAgfElyaXNoIFNlYXxJcmlzaCBTZWF8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8SVMtVEFVfCBJc3JhZWwgfCBJc3JhZWx8IFRlbCBBdml2IFVuaXZlcnNpdHl8QXNpYXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8IEpvbmF0aGFuIEJlbG1ha2VyIGpvbmF0aGFuLmJlbG1ha2VyQGdtYWlsLmNvbXxUb28gZmV3IHllYXJzfAp8SVMtTU9BR3xJc3JhZWx8SXNyYWVsfElzcmFlbGkgTWluaXN0cnkgb2YgQWdyaWN1bHR1cmV8QXNpYXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8T3JlbiBTb25pbiBvcmVuc0Btb2FnLmdvdi5pbCBhbmQgRG9yaSBFZGVsaXN0IGJsYWNrcmVlZnNAZ21haWwuY29tfEluY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHNwYWNlIGFuZCB0aW1lfAp8TUVESVRTICB8TWVkaXRlcnJhbmVhbnxNZWRpdGVycmFuZWFufE11bHRpcGxlfEV1cm9wZXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8Q29udGFjdCBjb3JyZXNwb25kaW5nIGF1dGhvciBmb3IgY29udGFjdHN8SW5jbHVkZWR8CnxNUlR8TWF1cml0YW5pYXxNYXVyaXRhbmlhfEluc3RpdHV0IE1hdXJpdGFuaWVuIGRlIFJlY2hlcmNoZXMgT2PDqWFub2dyYXBoaXF1ZXMgZXQgZGVzIFDDqmNoZXMsIE5vdWFkaGlib3UsIE1hdXJpdGFuaWF8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxCZXlhaCBNZWlzc2EgYm1vdWxkaGFiaWJAZ21haWwuY29tfEluY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHNwYWNlIGFuZCB0aW1lfAp8TkFNICB8TmFtaWJpYXxOYW1pYmlhfE5hdGlvbmFsIE1hcmluZSBJbmZvcm1hdGlvbiBhbmQgUmVzZWFyY2ggQ2VudHJlLCBNaW5pc3RyeSBvZiBGaXNoZXJpZXMgYW5kIE1hcmluZSBSZXNvdXJjZXMsIE5hbWliaWF8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxKb2hhbm5lcyBLYXRoZW5hIGpvaG4ua2F0aGVuYUBtZm1yLmdvdi5uYXxJbmNsdWRlZHwKfE5FVVMtRmFsbCAgfE5FIFVTIEZhbGx8Tm9ydGhlYXN0IFVTQSBGYWxsfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8TkVVUy1TcHJpbmcgIHxORSBVUyBTcHJpbmd8Tm9ydGhlYXN0IFVTQSBTcHJpbmd8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxOSUdGUy0xICB8TiBJcmVsYW5kIFExfE5vcnRoIElyZWxhbmQgUXVhcnRlciAxfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfE5JR0ZTLTQgIHxOIElyZWxhbmQgUTR8Tm9ydGggSXJlbGFuZCBRdWFydGVyIDR8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8Tm9yLUJUUy0zICB8QmFyZW50cyBTZWEgTm9yd2F5IFEzfEJhcmVudHMgU2VhIE5vcndheSBRM3xJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxOUy1JQlRTLTEgIHxOIFNlYSBRMXxOb3J0aCBTZWEgUXVhcnRlciAxfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfE5TLUlCVFMtMyAgfE4gU2VhIFEzfE5vcnRoIFNlYSBRdWFydGVyIDN8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8TlotQ0hBVCAgfENoYXRoYW0gUmlzZSBOWnxDaGF0aGFtIFJpc2UgTmV3IFplYWxhbmR8TmF0aW9uYWwgSW5zdGl0dXRlIG9mIFdhdGVyIGFuZCBBdG1vc3BoZXJpYyBSZXNlYXJjaCBMaW1pdGVkLCBOZXcgWmVhbGFuZHwgT2NlYW5pYXwgUmVxdWlyZXMgZGF0YSByZXF1ZXN0fFJpY2hhcmQgTydEcmlzY29sbCByaWNoYXJkLm9kcmlzY29sbEBuaXdhLmNvLm56IGFuZCBGYWJyaWNlIFN0ZXBoZW5zb24gZmFicmljZS5zdGVwaGVuc29uQHdhaWthdG8uYWMubnp8SW5jbHVkZWR8CnxOWi1FQ1NJICB8RSBDb2FzdCBTIElzbGFuZCBOWnxFYXN0IENvYXN0IFNvdXRoIElzbGFuZCBOZXcgWmVhbGFuZHxOYXRpb25hbCBJbnN0aXR1dGUgb2YgV2F0ZXIgYW5kIEF0bW9zcGhlcmljIFJlc2VhcmNoIExpbWl0ZWQsIE5ldyBaZWFsYW5kfCBPY2VhbmlhfCBSZXF1aXJlcyBkYXRhIHJlcXVlc3R8UmljaGFyZCBPJ0RyaXNjb2xsIHJpY2hhcmQub2RyaXNjb2xsQG5pd2EuY28ubnogYW5kIEZhYnJpY2UgU3RlcGhlbnNvbiBmYWJyaWNlLnN0ZXBoZW5zb25Ad2Fpa2F0by5hYy5uenxJbmNsdWRlZHwKfE5aLVNVQkEgIHxTdWItQW50YXJjdGljIE5afFN1Yi1BbnRhcmN0aWMgTmV3IFplYWxhbmR8TmF0aW9uYWwgSW5zdGl0dXRlIG9mIFdhdGVyIGFuZCBBdG1vc3BoZXJpYyBSZXNlYXJjaCBMaW1pdGVkLCBOZXcgWmVhbGFuZHwgT2NlYW5pYXwgUmVxdWlyZXMgZGF0YSByZXF1ZXN0fFJpY2hhcmQgTydEcmlzY29sbCByaWNoYXJkLm9kcmlzY29sbEBuaXdhLmNvLm56IGFuZCBGYWJyaWNlIFN0ZXBoZW5zb24gZmFicmljZS5zdGVwaGVuc29uQHdhaWthdG8uYWMubnp8SW5jbHVkZWR8CnxOWi1XQ1NJICB8VyBDb2FzdCBTIElzbGFuZCBOWnxXZXN0IENvYXN0IFNvdXRoIElzbGFuZCBOZXcgWmVhbGFuZHxOYXRpb25hbCBJbnN0aXR1dGUgb2YgV2F0ZXIgYW5kIEF0bW9zcGhlcmljIFJlc2VhcmNoIExpbWl0ZWQsIE5ldyBaZWFsYW5kfCBPY2VhbmlhfCBSZXF1aXJlcyBkYXRhIHJlcXVlc3R8UmljaGFyZCBPJ0RyaXNjb2xsIHJpY2hhcmQub2RyaXNjb2xsQG5pd2EuY28ubnogYW5kIEZhYnJpY2UgU3RlcGhlbnNvbiBmYWJyaWNlLnN0ZXBoZW5zb25Ad2Fpa2F0by5hYy5uenxJbmNsdWRlZHwKfFBULUlCVFMgIHxQb3J0dWdhbHxQb3J0dWdhbHxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxST0NLQUxMICB8Um9ja2FsbCBQbGF0ZWF1fFJvY2thbGwgUGxhdGVhdXxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxTLUdFT1JHICB8UyBHZW9yZ2lhfFNvdXRoIEdlb3JnaWF8QnJpdGlzaCBBbnRhcmN0aWMgU3VydmV5fFNvdXRoZXJuIE9jZWFufFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxNYXJrIEJlbGNoaWVyIG1hcmsuYmVsY2hpZXJAZ292LmdzIGFuZCBNYXJ0aW4gQ29sbGlucyBtYWNvbEBiYXMuYWMudWt8SW5jbHVkZWR8CnxTQ1MtRmFsbCAgfFNjb3RpYW4gU2hlbGYgRmFsbHxTY290aWFuIFNoZWxmIFN1bW1lcnxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfENhbmFkYXxQdWJsaWN8aHR0cHM6Ly9vcGVuLmNhbmFkYS5jYS9kYXRhL2VuL2RhdGFzZXQvMTM2NmUxZjEtZTJjOC00OTA1LTg5YWUtZTEwZjFiZTBhMTY0IGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfFRvbyBmZXcgeWVhcnN8SW5jbHVkZWR8CnxTQ1MtU1BSSU5HICB8U2NvdGlhbiBTaGVsZiBTcHJpbmd8U2NvdGlhbiBTaGVsZiBTcHJpbmd8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3wgQ2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC9mZWNmMDQ1YS05NWEyLTRiNjktOGE0MC04MTg2NDlhNjI3MTYgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8VG9vIG11Y2ggZGF0YSBsb3NzIGFmdGVyIHNwYXRpYWwgdGVtcG9yYWwgc3RhbmRhcmRpemF0aW9ufAp8U0NTLVNVTU1FUiAgfFNjb3RpYW4gU2hlbGYgU3VtbWVyfFNjb3RpYW4gU2hlbGYgU3VtbWVyfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC8xMzY2ZTFmMS1lMmM4LTQ5MDUtODlhZS1lMTBmMWJlMGExNjQgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxTRVVTLWZhbGwgIHxTRSBVUyBGYWxsfFNvdXRoZWFzdCBVU0EgRmFsbHxOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbnwgVVNBfFB1YmxpY3xEaXNNQVA6IGh0dHBzOi8vYXBwcy1zdC5maXNoZXJpZXMubm9hYS5nb3YvZGlzbWFwLyBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfFNFVVMtc3ByaW5nICB8U0UgVVMgU3ByaW5nfFNvdXRoZWFzdCBVU0EgU3ByaW5nfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8U0VVUy1zdW1tZXIgIHxTRSBVUyBTdW1tZXJ8U291dGhlYXN0IFVTQSBTdW1tZXJ8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxTV0MtSUJUUy0xICB8U2NvdGxhbmQgU2hlbGYgU2VhIFExfFNjb3RsYW5kIFNoZWxmIFNlYSBRdWFydGVyIDF8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8U1dDLUlCVFMtNCAgfFNjb3RsYW5kIFNoZWxmIFNlYSBRNHxTY290bGFuZCBTaGVsZiBTZWEgUXVhcnRlciA0fEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfFdCTFN8IFdlc3Rlcm4gQmxhY2sgU2VhfCBXZXN0ZXJuIEJsYWNrIFNlYXxJbnN0aXR1dGUgb2YgRmlzaCBSZXNvdXJjZXMsIEJ1bGdhcmlhfEV1cm9wZXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8RWxpdHNhIFBldHJvdmEgKGVsaXRzc2FAeWFob28uY29tKSwgRmVyaWhhIFRzZXJrb3ZhICYgVmVzc2VsaW5hIE1paG5ldmF8IFRvbyBmZXcgeWVhcnN8CnxXQ0FOTiAgfFcgQ29hc3QgVVN8V2VzdCBDb2FzdCBVU0F8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxaQUYtQVRMICB8QXRsYW50aWMgT2NlYW4gWkF8QXRsYW50aWMgT2NlYW4gU291dGggQWZyaWNhfERlcGFydG1lbnQgb2YgRm9yZXN0cnksIEZpc2hlcmllcyBhbmQgdGhlIEVudmlyb25tZW50LCBTb3V0aCBBZnJpY2F8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHwgVHJhY2V5IEZhaXJ3ZWF0aGVyIHRyYWNleWZAZGFmZi5nb3YuemF8SW5jbHVkZWR8CnxaQUYtSU5EICB8SW5kaWFuIE9jZWFuIFpBfEluZGlhbiBPY2VhbiBTb3V0aCBBZnJpY2F8RGVwYXJ0bWVudCBvZiBGb3Jlc3RyeSwgRmlzaGVyaWVzIGFuZCB0aGUgRW52aXJvbm1lbnQsIFNvdXRoIEFmcmljYXxBZnJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fCBUcmFjZXkgRmFpcndlYXRoZXIgdHJhY2V5ZkBkYWZmLmdvdi56YXxJbmNsdWRlZHwKCgoKCmBgYHtyIHB1bGwgaW4gZmlzaGdsb2IgZGF0YWJhc2V9CgpGaXNoR2xvYl8xLjUgPC0gZnJlYWQoaGVyZTo6aGVyZSgiZGF0YSIsIkZJU0hHTE9CX3YxLjVfY2xlYW4uY3N2IikpCgpgYGAKClRoaXMgdmVyc2lvbiBvZiBGaXNoR2xvYiBsZWF2ZXMgb3V0IHNlYXNvbnMgZm9yIEdNRVgsIGZpeCBoZXJlCgpgYGB7ciBhZGQgc2Vhc29uIHRvIEdNRVh9CiNhZGQgc2Vhc29uIHRvIEdNRVggdG8gc3VydmV5IHVuaXQKCkZpc2hHbG9iXzEuNVtzdXJ2ZXkgPT0gIkdNRVgiLCBzdXJ2ZXlfdW5pdCA6PSBwYXN0ZTAoc3VydmV5LCItIixzZWFzb24pXQpgYGAKCkFsc28gYWRkaW5nIGluIHNlYXNvbnMgZm9yIE5JR0ZTCgpgYGB7ciBhZGQgc2Vhc29uIHRvIE5JR0ZTfQojYWRkIHNlYXNvbiB0byBHTUVYIHRvIHN1cnZleSB1bml0CgpGaXNoR2xvYl8xLjVbc3VydmV5ID09ICJOSUdGUyIsIHN1cnZleV91bml0IDo9IHBhc3RlMChzdXJ2ZXksIi0iLHF1YXJ0ZXIpXQpgYGAKClpBRiAoU291dGggQWZyaWNhKSBoYXMgZGlzdGluY3QgQXRsYW50aWMgYW5kIEluZGlhbiBzdXJ2ZXlzIChzcGxpdCAgYXQgfjIwLjAxy5ogRSwgQ2FwZSBBZ3VsaGFzKQoKYGBge3IgYWRkIGxvbmdpdHVkaW5hbCByZWdpb24gdG8gWkFGfQpGaXNoR2xvYl8xLjVbc3VydmV5ID09ICJaQUYiICYgbG9uZ2l0dWRlIDwyMC4wMSwgc3VydmV5X3VuaXQgOj0gIlpBRi1BVEwiXVtzdXJ2ZXkgPT0gIlpBRiIgJiBsb25naXR1ZGUgPj0gMjAuMDEsIHN1cnZleV91bml0IDo9ICJaQUYtSU5EIl0KYGBgCgpSZWdpb24gbmFtZXMKYGBge3J9CnNvcnQodW5pcXVlKEZpc2hHbG9iXzEuNVssc3VydmV5X3VuaXRdKSkKYGBgCiMjRGF0YSBSZXBsYWNlbWVudHMKIyMjI0dyZWVubGFuZCAodmVyc2lvbiBpbiBGaXNoR2xvYiAxLjUgaXMgbWlzc2luZyBsZW5ndGhzIGFuZCB0aGVyZWZvcmUgYmlvbWFzcyB2YWx1ZXMpClRoaXMgdmVyc2lvbiB3YXMgb2J0YWluZWQgZGlyZWN0bHkgZnJvbSBLYXJsLU1pY2hhZWwgV2VybmVyIFtrYXJsLW1pY2hhZWwud2VybmVyQHRodWVuZW4uZGVdKGthcmwtbWljaGFlbC53ZXJuZXJAdGh1ZW5lbi5kZSkgd2hvIG5vdyBtYW5hZ2VzIHRoZSBHcmVlbmxhbmQgc3VydmV5IFNlcHRlbWJlciAyMDIzLiBIZSBpcyBiYXNlZCBpbiBHZXJtYW55LgoKYGBge3J9CiNncmVlbmxhbmQgPC0gCgpgYGAKCiMjIyNOb3J3YXkKUHJlcHBlZCBieSBMYXVyZW5lIFBlY3VjaGV0IChVIFRyw7Ztc28sIE5vcndheSkgU2VwdGVtYmVyIDIwMjMgdG8gcmVwbGFjZSB3aGF0J3MgaW4gRmlzaEdsb2IgMS41IGJlY2F1c2UgSU1SICJhcmUgcXVpdGUgY29uY2VybmVkIHRoYXQgRmlzaEdsb2IsIGFuZCBvdGhlciBzdHVkaWVzLCBoYXZlIGJlZW4gdXNpbmcgYSAiZmxhd2VkIiBtdWx0aS1zdXJ2ZXlzIGRhdGFzZXQgdGhhdCBpcyBhdmFpbGFibGUgaW4gTk1EQyAoZGF0YSBwb3J0YWwgb2YgSU1SKS4gVHVybnMgb3V0IHRoYXQgdGhpcyBkYXRhc2V0IHdhcyBwdXQgcHVibGljbHkgYnkgbWlzY29tbXVuaWNhdGlvbiBvbiBOTURDIGFmdGVyIG9uZSBwdWJsaXNoZWQgcGFwZXIgaW4gU2NpZW50aWZpYyBSZXBvcnRzLCBhbmQgSSB0aGluayB0aGV5IG9ubHkgcmVhbGl6ZWQgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIGRhdGFzZXQganVzdCB0aGUgbGFzdCB5ZWFyIGFzIHNvbWUgcGFwZXJzIGFyZSBjb21pbmcgb3V0IHVzaW5nIGl0IChlc3BlY2lhbGx5IHRoZSBvbmUgZnJvbSBDZXNjIEdvcmRvLVZpbGFzZWNhIGluIFBOQVMgaHR0cHM6Ly93d3cucG5hcy5vcmcvZG9pLzEwLjEwNzMvcG5hcy4yMTIwODY5MTIwKS4gVGhleSBhcmUgbm93IHRyeWluZyB0byBtYWtlIHNvbWUgZGFtYWdlIGNvbnRyb2xzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZGF0YXNldCBpcyBub3QgdXNlZCBldmVyIGFnYWluIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGF0IGNsZWFuZGVkIGFuZCBzdGFuZGFyZGlzZWQgZGF0YXNldHMgb2YgdGhlIEJhcmVudHMgU2VhIHN1cnZleSB0aGF0IGFyZSBwdWJsaWNseSBhdmFpbGFibGUgaW4gTk1EQyBhcmUgdXNlZCBpbnN0ZWFkIG9mLgoKU2VwdGVtYmVyIDE0OiBGcm9tIExhdXJlbmUsICJJIHNlbmQgeW91IGluIGF0dGFjaG1lbnQgdGhlIOKAnG5ld+KAnSBJTVIgc3VydmV5IGZvcm1hdHRlZCBmb3IgRmlzaGdsb2IuIEkgaGF2ZSBkb25lIHNvbWUgc21hbGwgY2hlY2sgb2YgdGhlIGRhdGFzZXQsIGFuZCBzbyBmYXIgZXZlcnl0aGluZyBsb29rcyBnb29kLCBidXQgSSBkaWRu4oCZdCBkbyBhIGRlZXAgY2hlY2sgeWV0LCBidXQgSSBkb27igJl0IHNlZSB3aHkgdGhlcmUgc2hvdWxkIGJlIGFueSBwcm9ibGVtcyB3aXRoIGl0Li4uLkZvciB5b3VyIHN0dWR5LCBJIHRoaW5rIGl0IGlzIGFsc28gaW1wb3J0YW50IHRoYXQgeW91IGtub3cgdGhhdCB0aGVyZSBoYXMgYmVlbiBzb21lIGluY29uc2lzdGVuY2llcyBpbiB0YXhvbm9taWMgZGVzY3JpcHRpb25zIGluIHRoZSBCYXJlbnRzIFNlYSBzbyB0aGF0IHNvbWUgc3BlY2llcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhdCB0aGUgZ2VudXMgbGV2ZWwgaW5zdGVhZCBvZiBmb3IgYmlvZGl2ZXJzaXR5IGFuYWx5c2lzLCBJIHNlbmQgeW91IGluIGF0dGFjaCBhbiBleGNlbCAoQmFyZW50cyBTZWEgRmlzaCBSZWZlcmVuY2UgTGlzdC5jc3YpIGZpbGUgdGhhdCBzdW1tYXJpemUgd2hpY2ggc3BlY2llcyBtaWdodCBiZSBhIG1pc2lkZW50aWZpY2F0aW9uIGFuZCB3aGljaCBvbmUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYW5kIG1lcmdlZC4iIEFsbCBvZiB0aGVzZSBmaWxlcyBub3cgbGl2ZSBpbiAiZGF0YS9Ob3J3YXlfU2VwMjAyMyIKCkhlbHBmdWwgZ3VpZGFuY2UgZnJvbSBoZXJlOiBodHRwczovL3d3dy5oaS5uby9lbi9oaS9uZXR0cmFwcG9ydGVyL3JhcHBvcnQtZnJhLWhhdmZvcnNrbmluZ2VuLWVuLTIwMjEtMTUKLSAiMi4yLjUgLSBSZWNvbW1lbmRlZCBhZGp1c3RtZW50cyB0byB0aGUgb3V0cHV0IGJlZm9yZSBhbmFseXNpcwpFZWxwb3V0cyBhbmQgbGlwYXJpZHMuIFdoZW4gY29tYmluZyB5ZWFycywgd2UgcmVjb21tZW5kIHRoYXQgYWxsIHJlY29yZHMgb2YgZWVscG91dHMgKFpvYXJjaWRhZSkgYXJlIHBvb2xlZCB0byB0aGUgZmFtaWx5IGxldmVsLCBiZWNhdXNlIHRoZXkgYXJlIG5vdG9yaW91c2x5IGRpZmZpY3VsdCB0byBpZGVudGlmeSAoc2VlIEFwcGVuZGl4IDMpLiBUaGUgc2FtZSBhcHBseSB0byBsaXBhcmlkcyAoTGlwYXJpZGFlKS4gSWYgc3BlY2llcyBsZXZlbCBkYXRhIG9mIHRoZXNlIGZhbWlsaWVzIGFyZSB1c2VkLCBjb25zaWRlciBleGNsdWRpbmcgZGF0YSBmcm9tIDIwMDQtMjAwNi8yMDA3LiBUaGVzZSB5ZWFycyB0aGUgc3RhZmYgb24gc29tZSBvZiB0aGUgTm9yd2VnaWFuIHZlc3NlbHMgd2VyZSBpbmV4cGVyaWVuY2VkLCBhbmQgcHJvcGVyIGlkZW50aWZpY2F0aW9uIGtleXMgZm9yIGFyY3RpYyBzcGVjaWVzIHdlcmUgbGFja2luZyAoY29tcGFyZSBmb3IgaW5zdGFuY2UgY2F0Y2hlcyBvZiBMeWNvZGVzIGZyaWdpZHVzIGFuZCBMeWNvZGVzIGV1ZGlwbGV1cm9zdGljdHVzIGluIHRoZSBmaXJzdCB5ZWFycyB0byB0aGUgbGF0ZXIgeWVhcnMsIEFwcGVuZGl4IDMpLiBJZiBzcGVjaWVzIGxldmVsIGRhdGEgb2YgdGhlc2UgZmFtaWxpZXMgYXJlIHVzZWQsIHJlY29yZHMgdG8gZmFtaWx5IGxldmVscyBzaG91bGQgYmUgcmVtb3ZlZCBvciBlbHNlIHRoZXNlIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIHNwZWNpZXMgaW4gdGhlIGZ1cnRoZXIgYW5hbHlzaXMgb2YgdGhlIGRhdGEuIEJvdGggWm9hcmNpZGFlIGFuZCBMaXBhcmlkYWUgaGF2ZSB1bnJlc29sdmVkIHRheG9ub215IGZvciBzb21lIGdlbmVyYSwgdGhlcmVmb3JlIHdlIGhhdmUgY2hvc2VuIHRvIHBvb2wgYWxsIGxpcGFyaWRzIG9mIHRoZSBnZW51cyBDYXJlcHJvY3R1cyBhbmQgYWxsIGVlbHBvdXRzIG9mIHRoZSBnZW51cyBHeW1uZWx1cyBpbiB0aGUgb3V0cHV0LiBTZWJhc3Rlcy4gVGhlIGNvbHVtbiAiIFNlYmFzdGVzIHNwcC4iIGNvbnRhaW5zIG1haW5seSBqdXZlbmlsZSByZWRmaXNoLiBTbWFsbCBzcGVjaW1lbnMgYXJlIHZlcnkgZGlmZmljdWx0IHRvIGlkZW50aWZ5IHNvIHRoZSBwcm90b2NvbCBpcyB0byBpZGVudGlmeSBvbmx5IGluZGl2aWR1YWxzIGxhcmdlciB0aGFuIDEwIGNtIHRvIHRoZSBzcGVjaWVzIGxldmVsLiBCZWZvcmUgYW5hbHlzaXMsIGFsbCByZWRmaXNoICggUyAuIG1lbnRlbGxhICwgUy4gbm9ydmVnaWN1cywgUy4gdml2aXBhcnVzIGFuZCBTZWJhc3RlcyBzcHAgLikgc2hvdWxkIGJlIHBvb2xlZCwgb3IgU2ViYXN0ZXMgc3BwLiBzaG91bGQgYmUgcmVtb3ZlZCDigJMgaWYgbm90IGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIHNwZWNpZXMgaW4gdGhlIGFuYWx5c2lzIC4gUmVjb3JkcyBpbiBBcHBlbmRpeCAyLiBUaGUgcmVjb3JkcyBvZiB0aGUgUy4gdml2aXBhcnVzIHdlc3Qgb2YgU3ZhbGJhcmQoU3BpdHNiZXJnZW4pIGFyZSB1bnJlbGlhYmxlIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBpZiBTZWJhc3RlcyBkYXRhIGFyZSBrZXB0IGF0IHRoZSBzcGVjaWVzIGxldmVsIChBcHBlbmRpeCAyKS4gU3BlY2llcyB2ZXJpZmllZCBmb3IgdGhlIEJhcmVudHMgU2VhLCBidXQgb3V0bGllcnMgaW4gdGVybXMgdGhlIG5vcm1hbCBkZXB0aCByYW5nZSwgZGlzdHJpYnV0aW9uIGFyZWEgd2l0aGluIHRoZSBCYXJlbnRzIFNlYSwgc2l6ZSBldGMuIHdlcmUgY29kZWQgYXMgcXVlc3Rpb25hYmxlIGluIHRoZSBkYXRhIGJhc2UgKEFwcGVuZGl4IDIpIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBiZWZvcmUgYW5hbHlzaXMuIENvbnNpZGVyIGFsc28gcmVtb3ZpbmcgcGVsYWdpYyBzcGVjaWVzIChlLmcuIGNhcGVsaW4gYW5kIGhlcnJpbmcpLCBhcyB0aGVzZSBhcmUgcG9vcmx5IHNhbXBsZWQgYnkgdGhlIGJvdHRvbSB0cmF3bC4gVGhlIGRhdGEgc2hvdWxkIGJlIHN0YW5kYXJkaXNlZCB3aXRoIHRvd2luZyBkaXN0YW5jZSBiZWZvcmUgYW5hbHlzaXMuIgoKVGhlcmVmb3JlLCB3ZSB3aWxsOgotIFJlbW92ZSBhbGwgcmVjb3JkcyBvZiBlZWxwb3V0cyBhbmQgbGlwYXJpZHMgKEZhbWlseSA9IFpvYXJjaWRhZSBvciBMaXBhcmlkYWUpIChhcyB3ZSBvbmx5IGluY2x1ZGUgc3BlY2llcyBJRCdkIHRvIHNwZWNpZXMpCi0gUmVtb3ZlIHJlZGZpc2ggKEdlbnVzID0gU2ViYXN0ZXMpCgpgYGB7ciBub3J3YXkgZGF0YX0KCiNsb2FkIE5vcndlZ2lhbiBkYXRhCmxvYWQoaGVyZTo6aGVyZSgiZGF0YSIsIk5vcndheV9TZXAyMDIzIiwiTk9SLUJUU19jbGVhbi5SRGF0YSIpKQpub3J3YXlfY2xlYW4gPC0gZGF0YS50YWJsZShkYXRhKQoKI3JlbW92ZSBvYnNlcnZhdGlvbnMgd2l0aG91dCBkYXRlcwpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuW2NvbXBsZXRlLmNhc2VzKG5vcndheV9jbGVhblssLihtb250aCldKSxdCgojcmVtb3ZlIHNwZWNpZXMgcmVjb3JkcyBpbiBhY2NvcmRhbmNlIHdpdGggcmVjb21tZW5kYXRpb24gZnJvbSBISQpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuWyEoZmFtaWx5ICVpbiUgYygiWm9hcmNpZGFlIiwiTGlwYXJpZGFlIikgfCBnZW51cyA9PSAiU2ViYXN0ZXMiKSxdCgojc29tZSBjb2x1bW4gbmFtZXMgZG9uJ3QgbWF0Y2ggZmlzaGdsb2IgKGZpc2hnbG9iID0gbnVtLCBudW1faCwgbnVtX2NwdWUsIHdndCwgd2d0X2gsIHdndF9jcHVlOyBub3J3YXkgPSBudW0sIG51bV9jcHVlIChudW1iZXIgb2YgaW5kLi9ob3VyKSwgbnVtX2NwdWEgKG51bWJlciBvZiBpbmQuL2ttMiksIHdndCwgd2d0X2NwdWUgKGtnL21pbiksIHdndF9jcHVhKGtnL2ttMikgICkKI2Fsc28sIHNvbWUgY29sdW1uIHVuaXRzIGluIHRoZSByZWFkbWUgYXJlIGluIGNvcnJlY3QuIFRoZXJlZm9yZSwgSSB3aWxsIGdlbmVyYXRlIF9jcHVlIGFuZCBfaCB2YWx1ZXMgaGVyZQojIHdlIHdpbGwgbmVlZCB0byBjaGVjayAgYW5kIHJlbmFtZSBjb2x1bW5zCnNldG5hbWVzKG5vcndheV9jbGVhbiwgYygiaGF1bF9kdXIiKSwgYygiaGF1bF9kdXJfbSIpKQpub3J3YXlfY2xlYW5bLGhhdWxfZHVyIDo9IGhhdWxfZHVyX20vNjBdICNoYXVsIGR1cmF0aW9uIGN1cnJlbnRseSBpbiBtaW51dGVzLCBuZWVkIGhvdXJzCm5vcndheV9jbGVhblssbnVtX2ggOj0gbnVtL2hhdWxfZHVyXVssbnVtX2NwdWUgOj0gbnVtL2FyZWFfc3dlcHRdWyx3Z3RfaCA6PSB3Z3QvaGF1bF9kdXJdWyx3Z3RfY3B1ZSA6PSB3Z3QvYXJlYV9zd2VwdF0KCiNjaGFuZ2Ugc29tZSBjb2x1bW5zIHRvIG51bWVyaWMKY29scyA9IGMoIm1vbnRoIiwiZGF5IikKbm9yd2F5X2NsZWFuWywoY29scykgOj0gbGFwcGx5KC5TRCxhcy5udW1lcmljKSwuU0Rjb2xzID0gY29sc10KCiNhbHNvLCBkZWxldGUgc291cmNlIGFuZCB0aW1lc3RhbXAKZmlzaGdsb2JfY29sbmFtZXMgPC0gY29sbmFtZXMoRmlzaEdsb2JfMS41KQpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuWywuLmZpc2hnbG9iX2NvbG5hbWVzXQoKbm9yd2F5X2NsZWFuW3N1cnZleSA9PSAiTm9yLUJUUyIgJiBtb250aCAlaW4lIGMoMTo2KSwgc3VydmV5X3VuaXQgOj0gIk5vci1CVFMtMSJdW3N1cnZleSA9PSAiTm9yLUJUUyIgJiBtb250aCAlaW4lIGMoNzoxMiksIHN1cnZleV91bml0IDo9ICJOb3ItQlRTLTMiXQoKI092ZXJsYXAgYmV0d2VlbiBJQlRTIGFuZCBOb3ItQlRTIHN1cnZleXMgYmVsb3cgNjLLmmxhdGl0dWRlLCBzbyBkZWxldGUgYWxsIGhhdWxzIHRoYXQgb2NjdXIgYmVsb3cgNjLLmmxhdGl0dWRlCm5vcndheV9jbGVhbiA8LSBub3J3YXlfY2xlYW5bbGF0aXR1ZGUgID49IDYyLF0KCmBgYAoKCkRlbGV0ZSBHcmVlbmxhbmQgYW5kIE5vcndheQpgYGB7cn0KRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKHN1cnZleSAlaW4lIGMoIk5vci1CVFMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMiR1JMLURFIiAjaWdub3JlIGdyZWVubGFuZCBmb3Igbm93Li4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXQpgYGAKCgpBZGQgaW4gdXBkYXRlZCBHcmVlbmxhbmQgYW5kIE5vcndheSBkYXRhCmBgYHtyfQpGaXNoR2xvYl8xLjUgPC1yYmluZChGaXNoR2xvYl8xLjUsbm9yd2F5X2NsZWFuKQojRmlzaEdsb2JfMS41IDwtcmJpbmQoRmlzaEdsb2JfMS41LGdyZWVubGFuZCkKYGBgCgoKIyNQcmVsaW1pbmFyeSBEYXRhIEN1dHMKIyMjU3BlY2lmaWMgUmVnaW9uYWwgQ2hhbmdlcyBCZWZvcmUgQ3V0dGluZyB0byAxMCB5ZWFycyBvbmx5CgoqR1NMKgotIE5vcnRoOiB3ZSBoYXZlIGRhdGEgMTk4MC0yMDE5LCBidXQgZ2VhciBjaGFuZ2VzIGluIDIwMDQvMjAwNSwgc28gbGV0J3MgdXNlIGxhdGVyIHBvcnRpb24gKG1vcmUgY29uc2lzdGVudCBtb250aHMgb2Ygc2FtcGxpbmc7IDIwMDUtMjAxOTsgMTUgeWVhcnMpIAotIFNvdXRoOiB3ZSBoYXZlIGRhdGEgMTk3MC0yMDE5LCBidXQgZ2Vhci92ZXNzZWwgY2hhbmdlcyBpbiAxOTg1IGFuZCBhZ2FpbiBpbiAxOTkyLCBzbyBhZ2FpbiBsZXQncyB1c2UgbGF0ZXIgcG9ydGlvbiAoMTk5Mi0yMDE5OyAyNyB5ZWFycykKLSBTZWUgW3RoaXMgZ2l0aHViIGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vQXF1YUF1bWEvZmlzaGdsb2IvaXNzdWVzLzcyKQoKYGBge3IgR1NMIGZpeGVzfQojaWRlbnRpZnkgaGF1bF9pZHMgb2YgaGF1bHMgd2Ugc2hvdWxkIHJlbW92ZSBmcm9tIEdTTCBzdXJ2ZXlzCmhhdWxfaWRzX3RvX3JlbW92ZV9HU0wgPC0gdW5pcXVlKEZpc2hHbG9iXzEuNVsoc3VydmV5ID09ICJHU0wtTiIgJiB5ZWFyIDwgMjAwNSl8KHN1cnZleSA9PSAiR1NMLVMiICYgeWVhciA8IDE5OTIpLGhhdWxfaWRdKQoKRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKGhhdWxfaWQgJWluJSBoYXVsX2lkc190b19yZW1vdmVfR1NMKSxdICNyZW1vdmUgaGF1bHMgYmVmb3JlIGNvbnNpc3RlbnQgZ2Vhci92ZXNzZWwgd2FzIHVzZWQKYGBgCgoqU0dFT1JHKgotIEZyb20gTWFydGluIENvbGxpbnMsICJNb3N0IHN1cnZleXMgd2VyZSBmb2N1c2VkIG9uIGRlbWVyc2FsIGZpc2ggb24gdGhlIFNvdXRoIEdlb3JnaWEgc2hlbGYgKDwgMzUwIG0pLCBidXQgc3VydmV5cyBpbiAyMDAzLCAyMDEwIGFuZCAyMDE5IGhhZCBzb21lIGRlZXBlciB0cmF3bHMuICBUaGUgZGVlcGVyIHRyYXdscyBjYXVnaHQgdmVyeSBkaWZmZXJlbnQgZmlzaCwgc28gYXJlIHVubGlrZWx5IHRvIGJlIG9mIHVzZSB0byBhIGxvbmctdGVybSBhbmFseXNpcywgYnV0IEkgaGF2ZSBsZWZ0IHRoZW0gaW4uIgoKLURlbGV0ZSBhbGwgdHJhd2xzIGRlZXBlciB0aGFuIDM1MCBNCmBgYHtyfQojaWRlbnRpZnkgaGF1bF9pZHMgb2YgaGF1bHMgd2Ugc2hvdWxkIHJlbW92ZSBmcm9tIEdTTCBzdXJ2ZXlzCmhhdWxfaWRzX3RvX3JlbW92ZV9TR0VPUkcgPC0gdW5pcXVlKEZpc2hHbG9iXzEuNVsoc3VydmV5ID09ICJTR0VPUkciICYgZGVwdGggPjM1MCksaGF1bF9pZF0pCgpGaXNoR2xvYl8xLjUgPC0gRmlzaEdsb2JfMS41WyEoaGF1bF9pZCAlaW4lIGhhdWxfaWRzX3RvX3JlbW92ZV9TR0VPUkcpLF0gI3JlbW92ZSBoYXVscyBiZWZvcmUgY29uc2lzdGVudCBnZWFyL3Zlc3NlbCB3YXMgdXNlZApgYGAKCipOWi1DSEFUKgotYnVtcCBkZWNlbWJlciBvYnNlcnZhdGlvbnMgdG8gbmV4dCB5ZWFyIGJlY2F1c2Ugb2JzZXJ2YXRpb25zIG9jY3VyIGluIDEyLDEsMgpgYGB7cn0KI2J1bXAgb2JzZXJ2YXRpb25zIGZvcndhcmQKRmlzaEdsb2JfMS41W3N1cnZleSA9PSAiTlotQ0hBVCIgJiBtb250aCA9PSAxMiwgIHllYXIgOj0geWVhcisxLCBdCmBgYAoKCiMjI0JlY2F1c2UgdGltZSBpcyBhbiBlc3NlbnRpYWwgY29tcG9uZW50IG9mIHRoZXNlIGFuYWx5c2VzLCB3ZSB3aWxsIGdldCByaWQgb2YgYW55IHN1cnZleSB4IHNlYXNvbiBjb21iaW5hdGlvbnMgdGhhdCBhcmUgbm90IHNhbXBsZWQgZm9yIGF0IGxlYXN0IDEwIHllYXJzCgpgYGB7ciBzdW1tYXJ5IGJ5IHN1cnZleSByZWdpb259CiNuZXcgcm93IGZvciB0b3RhbCBudW1iZXIgb2YgeWVhcnMgc2FtcGxlZApGaXNoR2xvYl8xLjVbLHllYXJzX3NhbXBsZWQgOj0gbGVuZ3RoKHVuaXF1ZSh5ZWFyKSksLihzdXJ2ZXlfdW5pdCldCgpzdW1tYXJ5KEZpc2hHbG9iXzEuNSR5ZWFyc19zYW1wbGVkKSAjcmFuZ2VzIGZyb20gMiAoREZPIFN0cmFpZ2h0IG9mIEdlb3JnaWEpIHRvIDU3IChOb3J0aGVhc3QgVVMpClZpZXcodW5pcXVlKEZpc2hHbG9iXzEuNVssLihzdXJ2ZXlfdW5pdCwgeWVhcnNfc2FtcGxlZCldKSkKCiNzdGF0aXN0aWNzIGFib3V0IGZ1bGwgZGF0YXNldApucm93KEZpc2hHbG9iXzEuNSkgCmxlbmd0aCh1bmlxdWUoRmlzaEdsb2JfMS41WyxzdXJ2ZXldKSkgCmxlbmd0aCh1bmlxdWUoRmlzaEdsb2JfMS41WyxzdXJ2ZXlfdW5pdF0pKSAKCiNyZW1vdmUgb2JzZXJ2YXRpb25zIGZvciBhbnkgcmVnaW9ucyB4IHNlYXNvbiBjb21iaW5hdGlvbnMgc2FtcGxlZCBsZXNzIHRoYW4gMTAgdGltZXMKRmlzaEdsb2IuMTB5ZWFyIDwtIEZpc2hHbG9iXzEuNVt5ZWFyc19zYW1wbGVkID49IDEwLF0KCiNzdGF0aXN0aWNzIGFib3V0IHJlZHVjZWQgMTAgeWVhciBkYXRhc2V0Cm5yb3coRmlzaEdsb2IuMTB5ZWFyKSAKbGVuZ3RoKHVuaXF1ZShGaXNoR2xvYi4xMHllYXJbLHN1cnZleV0pKSAKbGVuZ3RoKHVuaXF1ZShGaXNoR2xvYi4xMHllYXJbLGFzLmNoYXJhY3RlcihzdXJ2ZXlfdW5pdCldKSkgCgojcmVtb3ZlIGZ1bGwgZGF0YWJhc2UKcm0oRmlzaEdsb2JfMS41KQoKCmBgYAoKIyMjRm9yIHRheG9ub21pYyBhbmFseXNlcywgcmVzb2x1dGlvbiB0byBzcGVjaWVzIGlzIHJlcXVpcmVkLiBUaGVyZWZvcmUsIHdlIHdpbGwgIGV4Y2x1ZGUgYW55IG9ic2VydmF0aW9ucyBub3QgcmVzb2x2ZWQgdG8gc3BlY2llcy4gCgpgYGB7ciBzcHAgSUQgb25seX0KI21vbnRoIGEgbnVtYmVyCkZpc2hHbG9iLjEweWVhclssbW9udGggOj0gYXMubnVtZXJpYyhtb250aCldCgpGaXNoR2xvYi4xMHllYXIuc3BwIDwtIEZpc2hHbG9iLjEweWVhcltyYW5rICVpbiUgYygiU3BlY2llcyIsICJTdWJzcGVjaWVzIiksXSAjMzg2OTM4NCB0b3RhbCBvYnNlcnZhdGlvbnMKCiNyZW1vdmUgZnVsbCBzcGVjaWVzIGRhdGFiYXNlCnJtKEZpc2hHbG9iLjEweWVhcikKCiN2ZWN0b3Igd2l0aCBhbGwgc3VydmV5IG5hbWVzCmFsbF9zdXJ2ZXlfdW5pdHMgPC0gc29ydCh1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnNwcFssc3VydmV5X3VuaXRdKSkKCiNjYWxjdWxhdGUgIyBzcGVjaWVzIHBlciB5ZWFyCkZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBbLC4oc3VydmV5X3VuaXQsIHllYXIsIGFjY2VwdGVkX25hbWUpXSkKCkZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXJbLHNwcF9jb3VudF9zdXJ2ZXlfeWVhciA6PSB1bmlxdWVOKGFjY2VwdGVkX25hbWUpLC4oc3VydmV5X3VuaXQsIHllYXIpXQoKRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yIDwtdW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXJbLC4oc3VydmV5X3VuaXQsICB5ZWFyLCBzcHBfY291bnRfc3VydmV5X3llYXIpXSkKCm5yb3coRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yKQoKI2NhbGN1bGF0ZSAjIGhhdWxzIHBlciB5ZWFyCkZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBbLC4oc3VydmV5X3VuaXQsIHllYXIsIGhhdWxfaWQpXSkKCkZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXJbLGhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhciA6PSB1bmlxdWVOKGhhdWxfaWQpLC4oc3VydmV5X3VuaXQsIHllYXIpXQoKRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yIDwtdW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXJbLC4oc3VydmV5X3VuaXQsICB5ZWFyLCBoYXVsaWRfY291bnRfc3VydmV5X3llYXIpXSkKCm5yb3coRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yKQoKYGBgCgoKIyNWaXN1YWxseSBJbnNwZWN0IERpc3RyaWJ1dGlvbiBvZiBEYXRhIFRocm91Z2ggVGltZSBhbmQgU3BhY2UKCiMjU3BhdGlhbCBhbmQgVGVtcG9yYWwgUGF0dGVybnMgaW4gQWxsIFRyYXdsIFN1cnZleXMKCkxldCdzIGxvb2sgYXQgdGhlIG51bWJlciBvZiBoYXVscyBwZXIgeWVhci9tb250aCBhbmQgeWVhci9xdWFydGVyIGFuZCB5ZWFyL3NlYXNvbiB2aXN1YWxseQoKYGBge3IgaGF1bHMgcGVyIHllYXIsIG1vbnRoLCBxdWFydGVyfQojdW5pcXVlIHN1cnZleSwgc3VydmV5X3VuaXQsIHllYXIsIG1vbnRoLCBxdWFydGVyLCBzZWFzb24sIGhhdWxfaWQsIGxhdCwgbG9uCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscyA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnNwcFssLihzdXJ2ZXksIHN1cnZleV91bml0LCB5ZWFyLG1vbnRoLHF1YXJ0ZXIsc2Vhc29uLGhhdWxfaWQsIGxhdGl0dWRlLCBsb25naXR1ZGUsaGF1bF9kdXIpXSkKCiNhZGQgY29sdW1uIHdpdGggYWRqdXN0ZWQgbG9uZ2l0dWRlIGZvciBmZXcgc3VydmV5cyB0aGF0IGNyb3NzIGRhdGVsaW5lIChOWi1DSEFUIGFuZCBBSSkKRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWyxsb25naXR1ZGVfYWRqIDo9IGlmZWxzZSgoc3VydmV5X3VuaXQgJWluJSBjKCJBSSIsIk5aLUNIQVQiKSAmIGxvbmdpdHVkZSA+IDApLGxvbmdpdHVkZS0zNjAsbG9uZ2l0dWRlKV0KCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1ssaGF1bF9jb3VudHNfcGVyX3N1cnZleV9zZWFzb25fbW9udGggOj11bmlxdWVOKGhhdWxfaWQpLC4oc3VydmV5LCBtb250aCwgc2Vhc29uKV1bLCAjY291bnQgIyBoYXVscyBwZXIgc3VydmV5LCBzZWFzb24sIGFuZCBtb250aAogICAgICAgICAgICAgICAgICAgICBoYXVsX2NvdW50c19wZXJfc3VydmV5X3F1YXJ0ZXJfbW9udGggOj11bmlxdWVOKGhhdWxfaWQpLC4oc3VydmV5LCBtb250aCwgcXVhcnRlcildWywjY291bnQgIyBoYXVscyBwZXIgc3VydmV5LCBtb250aCwgYW5kIHF1YXJ0ZXIKICAgICAgICAgICAgICAgICAgICAgdG90YWxfaGF1bHNfc3VydmV5IDo9dW5pcXVlTihoYXVsX2lkKSwuKHN1cnZleSldWywjY291bnQgIyBoYXVscyBwZXIgc3VydmV5IGluIGFsbCB5ZWFycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICNwcm9wb3J0aW9uIG9mIGhhdWxzIGZvciBlYWNoIHN1cnZleSwgc2Vhc29uLCBhbmQgbW9udGggZGl2aWRlZCBieSB0b3RhbCAjIG92ZXIgYWxsIHllYXJzCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uIDo9aGF1bF9jb3VudHNfcGVyX3N1cnZleV9zZWFzb25fbW9udGgvdG90YWxfaGF1bHNfc3VydmV5XVssCiAgICAgICAgICAgICAgI3Byb3BvcnRpb24gb2YgaGF1bHMgZm9yIGVhY2ggc3VydmV5LCBxdWFydGVyLCBhbmQgbW9udGggZGl2aWRlZCBieSB0b3RhbCAjIG92ZXIgYWxsIHllYXJzCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciA6PWhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfcXVhcnRlcl9tb250aC90b3RhbF9oYXVsc19zdXJ2ZXldWywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX21vbnRoIDo9dW5pcXVlTihoYXVsX2lkKSwuKHllYXIsIHN1cnZleV91bml0LCBtb250aCldWywgI2NvdW50ICMgaGF1bHMgcGVyIHN1cnZleSB1bml0LCB5ZWFyLCBhbmQgbW9udGgKICAgICAgICAgICAgICAgICAgICAgdG90YWxfaGF1bHNfc3VydmV5X3llYXIgOj0gdW5pcXVlTihoYXVsX2lkKSwuKHN1cnZleV91bml0LHllYXIpXVssICNjb3VudCB0b3RhbCAjIGhhdWxzIHBlciBzdXJ2ZXkgdW5pdCBhbmQgeWVhcgogICAgICAgICAgICAgICAgICAgICAjcHJvcG9ydGlvbiBvZiBoYXVscyBmb3IgZWFjaCBzdXJ2ZXkgdW5pdCBhbmQgbW9udGggZGl2aWRlZCBieSB0b3RhbCAjIGhhdWxzIHdpdGhpbiBhIHN1cnZleSB1bml0IHdpdGhpbiBhIHllYXIKICAgICAgICAgICAgICAgICAgICAgaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSA6PSBoYXVsX2NvdW50X3Blcl9zdXJ2ZXlfeWVhcl9tb250aC90b3RhbF9oYXVsc19zdXJ2ZXlfeWVhcl1bLCAKCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX3F1YXJ0ZXIgOj11bmlxdWVOKGhhdWxfaWQpLC4oeWVhciwgc3VydmV5X3VuaXQsIHF1YXJ0ZXIpXVssICNjb3VudCAjIGhhdWxzIHBlciBzdXJ2ZXkgdW5pdCwgeWVhciwgYW5kIG1vbnRoCiAgICAgICAgICAgICAgICAgICAgICNwcm9wb3J0aW9uIG9mIGhhdWxzIGZvciBlYWNoIHN1cnZleSB1bml0IGFuZCBtb250aCBkaXZpZGVkIGJ5IHRvdGFsICMgaGF1bHMgd2l0aGluIGEgc3VydmV5IHVuaXQgd2l0aGluIGEgeWVhcgogICAgICAgICAgICAgICAgICAgICBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkgOj0gaGF1bF9jb3VudF9wZXJfc3VydmV5X3llYXJfcXVhcnRlci90b3RhbF9oYXVsc19zdXJ2ZXlfeWVhcl0gCgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLC4oc3VydmV5LCBzdXJ2ZXlfdW5pdCwgbW9udGgsIHNlYXNvbiwgaGF1bF9jb3VudHNfcGVyX3N1cnZleV9zZWFzb25fbW9udGgsdG90YWxfaGF1bHNfc3VydmV5LCBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbildKSAjcmVsYXRpdmUgc2FtcGxpbmcgYnkgc2Vhc29uIGFjcm9zcyBhbGwgeWVhcnMKCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLC4oc3VydmV5LHN1cnZleV91bml0ICwgbW9udGgsIHF1YXJ0ZXIsIGhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfcXVhcnRlcl9tb250aCx0b3RhbF9oYXVsc19zdXJ2ZXksIGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlcildKSAjcmVsYXRpdmUgc2FtcGxpbmcgYnkgcXVhcnRlciBhY3Jvc3MgYWxsIHllYXJzCgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLC4oc3VydmV5LCB5ZWFyLCBzdXJ2ZXlfdW5pdCwgbW9udGgsIGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX21vbnRoLHRvdGFsX2hhdWxzX3N1cnZleV95ZWFyLGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpXSkgI3JlbGF0aXZlIHNhbXBsaW5nIGJ5IG1vbnRoIHdpdGhpbiB5ZWFycwoKRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLC4oc3VydmV5LCB5ZWFyLCBzdXJ2ZXlfdW5pdCwgcXVhcnRlciwgaGF1bF9jb3VudF9wZXJfc3VydmV5X3llYXJfcXVhcnRlcix0b3RhbF9oYXVsc19zdXJ2ZXlfeWVhcixoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpXSkgI3JlbGF0aXZlIHNhbXBsaW5nIGJ5IG1vbnRoIHdpdGhpbiB5ZWFycwoKI2hvdyBkb2VzICNoYXVscyB2YXJ5IHdpdGggc2Vhc29uIGFuZCBtb250aD8Kc3VydmV5X3NlYXNvbl9tb250aF9oYXVscyA8LSBnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbikgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIGZhY2V0X3dyYXAofnN1cnZleSxzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dzYXZlKHN1cnZleV9zZWFzb25fbW9udGhfaGF1bHMsIGZpbGVuYW1lID0gInN1cnZleV9zZWFzb25fbW9udGhfaGF1bHMucGRmIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA1LCB3aWR0aCA9IDE1LCB1bml0cyA9ICJpbiIpCgojaG93IGRvZXMgI2hhdWxzIHZhcnkgd2l0aCBxdWFydGVyIGFuZCBtb250aD8Kc3VydmV5X3F1YXJ0ZXJfbW9udGhfaGF1bHMgPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgZmFjZXRfd3JhcCh+c3VydmV5LHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUoc3VydmV5X3F1YXJ0ZXJfbW9udGhfaGF1bHMsIGZpbGVuYW1lID0gInN1cnZleV9xdWFydGVyX21vbnRoX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gNSwgd2lkdGggPSAxNSwgdW5pdHMgPSAiaW4iKQoKI2hvdyBkb2VzICNoYXVscyB2YXJ5IHdpdGggeWVhciBhbmQgbW9udGg/CnllYXJfc3VydmV5X21vbnRoX2hhdWxzIDwtIGdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIGZhY2V0X3dyYXAofnN1cnZleV91bml0LHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUoeWVhcl9zdXJ2ZXlfbW9udGhfaGF1bHMsIGZpbGVuYW1lID0gInllYXJfc3VydmV5X21vbnRoX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxNiwgdW5pdHMgPSAiaW4iKQpnZ3NhdmUoeWVhcl9zdXJ2ZXlfbW9udGhfaGF1bHMsIGZpbGVuYW1lID0gInllYXJfc3VydmV5X21vbnRoX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxNiwgdW5pdHMgPSAiaW4iKQoKI2hvdyBkb2VzICNoYXVscyB2YXJ5IHdpdGggeWVhciBhbmQgbW9udGg/CnllYXJfc3VydmV5X3F1YXJ0ZXJfaGF1bHMgPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcikgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICBmYWNldF93cmFwKH5zdXJ2ZXlfdW5pdCxzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dzYXZlKHllYXJfc3VydmV5X3F1YXJ0ZXJfaGF1bHMsIGZpbGVuYW1lID0gInllYXJfc3VydmV5X3F1YXJ0ZXJfaGF1bHMucGRmIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDE2LCB1bml0cyA9ICJpbiIpCmdnc2F2ZSh5ZWFyX3N1cnZleV9xdWFydGVyX2hhdWxzLCBmaWxlbmFtZSA9ICJ5ZWFyX3N1cnZleV9xdWFydGVyX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxNiwgdW5pdHMgPSAiaW4iKQpgYGAKCk5vdywgbGV0J3MgbG9vayBhdCBob3cgbG9jYXRpb24gb2Ygc2FtcGxpbmcgdmFyaWVzIGJ5IG1vbnRoIG9mIHNhbXBsaW5nIGFuZCB5ZWFyIG9mIHNhbXBsaW5nIAoKYGBge3IgbG9jYXRpb24gYnkgeWVhciBwbG90c30KbG9jYXRpb25fYnlfeWVhciA8LSBnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIGZhY2V0X3dyYXAofnN1cnZleV91bml0LCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZShsb2NhdGlvbl9ieV95ZWFyLCBmaWxlbmFtZSA9ICJsb2NhdGlvbl9ieV95ZWFyLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxMiwgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKGxvY2F0aW9uX2J5X3llYXIsIGZpbGVuYW1lID0gImxvY2F0aW9uX2J5X3llYXIuanBnIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDEyLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUobG9jYXRpb25fYnlfeWVhciwgZmlsZW5hbWUgPSAibG9jYXRpb25fYnlfeWVhci5lcHMiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTIsIHVuaXRzID0gImluIikKYGBgCgoKYGBge3IgbG9jYXRpb24gYnkgbW9udGggcGxvdHN9Cihsb2NhdGlvbl9ieV9tb250aCA8LSBnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBhcy5udW1lcmljKG1vbnRoKSksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIGZhY2V0X3dyYXAofnN1cnZleV91bml0LCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUobG9jYXRpb25fYnlfbW9udGgsIGZpbGVuYW1lID0gImxvY2F0aW9uX2J5X21vbnRoLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxMiwgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKGxvY2F0aW9uX2J5X21vbnRoLCBmaWxlbmFtZSA9ICJsb2NhdGlvbl9ieV9tb250aC5qcGciLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTIsIHVuaXRzID0gImluIikKCmdnc2F2ZShsb2NhdGlvbl9ieV9tb250aCwgZmlsZW5hbWUgPSAibG9jYXRpb25fYnlfbW9udGguZXBzIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDEyLCB1bml0cyA9ICJpbiIpCmBgYAoKCiMjUmVnaW9uIFNwZWNpZmljIERhdGEgUHJvY2Vzc2luZwoKLUZyZWRzdG9uIGV0IGFsLiAyMDIyIE5hdHVyZSBhbmQgQmF0dCBldCBhbC4gMjAxNyBFY29sb2d5IExldHRlcnMgaW5mb3JtZWQgTm9ydGggQW1lcmljYW4gZGF0YSBwcm9jZXNzaW5nCi1QZXJzb25hbCBjb21tdW5pY2F0aW9uIHdpdGggQXVyb3JlIE1hdXJlYXVkIGFuZCBMYXVyZW5lIFBlY3VjaGV0IHJlOiB3b3JrIGJ5IEEuIE1hdXJlYXVkLCBMLiBQZWN1Y2hldCBhbmQgUi4gRnJlbGF0IGFuZCB0aGUgc3VwcGxlbWVudGFyeSBtYXRlcmlhbCBmb3IgTWF1cmVhdWQgZXQgYWwuIDIwMTkgUHJvY2VlZGluZ3Mgb2YgdGhlIFJveWFsIFNvY2lldHkgQjogQmlvbG9naWNhbCBTY2llbmNlcyBpbmZvcm1lZCBFdXJvcGVhbiBkYXRhIHByb2Nlc3NpbmcKLUFkZGl0aW9uYWwgZGF0YSBwcm9jZXNzaW5nIGluZm9ybWVkIGJ5IGRhdGEgaXRzZWxmLCBhbmQgYnkgRmlzaEdsb2IgcGRmIHN1bW1hcnkgZG9jdW1lbnRzCi1saW1pdCB0byBtYXggMyBtb250aHMgZm9yIGVhY2ggc3VydmV5IHVuaXQsIHJlcHJlc2VudGF0aXZlIG9mIGEgJ3NlYXNvbicgKGV4Y2VwdGlvbiA9IFdlc3QgQ29hc3QgVVNBIHdoZXJlIGFsbCA0IG1vbnRocyBzYW1wbGVkIGNvbnNpc3RlbnRseSkKCiMjIyMiQUkiCmBgYHtyIEFJIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5ID09ICJBSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJBSSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQUkiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAotIE1vc3QgaGF1bHMgaW4gNiw3LDgKLSBTZWVtaW5nbHkgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLSBObyBkcmFtYXRpYyBjaGFuZ2VzIGluIHNwcCByaWNobmVzcyAKYGBge3IgQUkgcHJvY2Vzc2luZ30KYWlfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJBSSIgJiBtb250aCAlaW4lIGMoNjo4KSxoYXVsX2lkXSkKYGBgCgoKIyMjI0JJVFMKKFdlIGhhdmUgdHdvIHN1cnZleXMgZm9yIEJJVFMsIHF1YXJ0ZXIgMSBhbmQgcXVhcnRlciA0KQpCSVRTIDEKCkZyb20gRnJlZHN0b24gZXQgYWwuIDIwMjMsIGV2ZXJ5IHllYXIgYWZ0ZXIgMjAwMCBoYXMgPjQwMCBoYXVscyBhbmQgbW9zdCBvZiB0aGUgZWFybGllciB5ZWFycyBhcmUgPDUwIAoKYGBge3IgIEJJVFMxIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkJJVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkJJVFMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCi1LZWVwIGJvdGggbW9udGhzICgyLDMpCi1TZWVtaW5nbHkgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLUNvbnNpc3RlbnQgIyBvZiBzcGVjaWVzIGFuZCAjIGhhdWxzIGFmdGVyIDIwMDAKYGBge3IgQklUUzEgcHJvY2Vzc2luZ30KYml0czFfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTEiICYgbW9udGggJWluJSBjKDIsMykgJiB5ZWFyID4gMjAwMCxoYXVsX2lkXSkKYGBgCgpCSVRTNApgYGB7ciAgQklUUzQgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiQklUUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQklUUy00IixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCi1LZWVwICgxMCwxMSwxMikKLVN0YXJ0IGluIDIwMDAgKHN0YXJ0cyBpbiAxOTk2LCBidXQgZ2FwIGluIDE5OTcgYW5kIDE5OTgsIGFuZCAxOTk2IGFsbCBpbiBEZWNlbWJlcjsgYWxzbyBzcHAgcmljaG5lc3MgaW4gZmlyc3Qgc3VydmV5IHZlcnkgbG93OyBjb25zaXN0ZW50ICMgb2YgaGF1bHMgYWZ0ZXIgMjAwMCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQoKYGBge3IgQklUUzQgcHJvY2Vzc2luZ30KYml0czRfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTQiICYgbW9udGggJWluJSBjKDEwOjEyKSAmIHllYXIgPiAyMDAwLGhhdWxfaWRdKQpgYGAKCgojIyMjQ0hMIChDaGlsZSkKCmBgYHtyICBDSEwgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiQ0hMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkNITCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQ0hMIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKLUtlZXAgKDcsOCw5KQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluIHNwcCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLU5vIG1ham9yIGNoYW5nZXMgaW4gIyBoYXVscyB0aHJvdWdoIHRpbWUKCmBgYHtyIENITCBwcm9jZXNzaW5nfQpjaGxfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJDSEwiICYgbW9udGggJWluJSBjKDc6OSksaGF1bF9pZF0pCmBgYAoKCgojIyMjREZPLU5GCgoKYGBge3IgIERGTy1ORiB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJERk8tTkYiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJERk8tTkYiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKLUtlZXAgKDEwLDExLDEyKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluIHNwcCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLU5vIG1ham9yIGNoYW5nZXMgaW4gaGF1bGlkIHRocm91Z2ggdGltZQoKYGBge3IgREZPLU5GIHByb2Nlc3Npbmd9CmRmb19uZl9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIgJiBtb250aCAlaW4lIGMoMTA6MTIpLGhhdWxfaWRdKQpgYGAKCgojIyMjREZPLVFDUwoKYGBge3IgIERGTy1RQ1MgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAotS2VlcCAoNyw4KQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluIHJpY2huZXNzIG92ZXIgdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiAjaGF1bHMKCmBgYHtyIERGTy1RQ1MgcHJvY2Vzc2luZ30KZGZvX3Fjc19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiICYgbW9udGggJWluJSBjKDcsOCksaGF1bF9pZF0pCmBgYAoKCgojIyMjRUJTCgotU2FtcGxpbmcgeWVhcnMgcHJpb3IgdG8gMTk4NCAoZGF0YSBiZWdpbiBpbiAxOTgyKSB3ZXJlIGV4Y2x1ZGVkIGZyb20gYW5hbHlzaXMgZHVlIHRvIGxhcmdlIGFwcGFyZW50IGluY3JlYXNlcyBpbiB0aGUgbnVtYmVyIG9mIHNwZWNpZXMgcmVjb3JkZWQgaW4gdGhlIGZpcnN0IHR3byB5ZWFycy4gKEJhdHQgZXQgYWwuIDIwMTcpCgpgYGB7ciAgRUJTIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkVCUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJFQlMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkVCUyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgotS2VlcCAoNiw3LDgpCi1TZWVtaW5nbHkgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVBlciBCYXR0IGV0IGFsLiAyMDE3LCBsaW1pdCB0byA+PSAxOTg0Ci1ObyBjbGVhciBjaGFuZ2VzICBpbiByaWNobmVzcyB0aHJvdWdoIHRpbWUKLU5vIGNsZWFyIGNoYW5nZXMgaW4gIyBoYXVscyB0aHJvdWdoIHRpbWUKCmBgYHtyIEVCUyBwcm9jZXNzaW5nfQplYnNfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJFQlMiICYgbW9udGggJWluJSBjKDYsNyw4KSAmIHllYXIgPj0gMTk4NCxoYXVsX2lkXSkKYGBgCgoKIyMjI0VWSE9FCgpgYGB7ciAgRVZIT0UgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgKDEwLDExLDEyKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1WZXJ5IGxvdyBzYW1wbGluZyBpbiAyMDE3IChhbmQgYWxzbyBsb3cgcmljaG5lc3MpLCBleGNsdWRlIHRoaXMgeWVhcgoKYGBge3IgRVZIT0UgcHJvY2Vzc2luZ30KZXZob2VfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJFVkhPRSIgJiBtb250aCAlaW4lIGMoMTAsMTEsMTIpICYgeWVhciAhPSAyMDE3ICxoYXVsX2lkXSkKYGBgCgoKIyMjI0ZBTEsgKGV4Y2x1ZGVkIGZyb20gZmluYWwgZGF0YXNldCkKYGBge3IgRkFMSyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAotS2VlcCBGZWJydWFyeSAoMikgb25seSBmcm9tIDIwMDQgb253YXJkIChtb3N0IGNvbnNpc3RlbnQgc2FtcGxpbmcpCi1JbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgdGhpcyB3aWxsIGJlIGZpeGVkIGluIG5leHQgc3RlcCB3aXRoIHNwYXRpYWwgc3RhbmRhcmRpemF0aW9uCgoKYGBge3IgRkFMSyBwcm9jZXNzaW5nfQpmYWxrX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIgJiBtb250aCAlaW4lIGMoMikgJiB5ZWFyID49IDIwMDQsIGhhdWxfaWRdKQpgYGAKCgojIyMjRlItQ0dGUwoKYGBge3IgIEZSLUNHRlMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKLUtlZXAgOSwxMCwxMQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIHRocm91Z2ggdGltZQotU2VlZW1pbmdseSBjb25zaXN0ZW50ICNoYXVscyB0aHJvdWdoIHRpbWUKCgpgYGB7ciBGUi1DR0ZTIHByb2Nlc3Npbmd9CmZyX2NnZnNfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIiAmIG1vbnRoICVpbiUgYyg5LDEwLDExKSwgaGF1bF9pZF0pCmBgYAoKIyMjI0dJTiAoZXhjbHVkZWQgZnJvbSBmaW5hbCBkYXRhc2V0KQoKYGBge3IgIEdJTiB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHSU4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJHSU4iLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1FeGNsdWRlIHRoaXMgcmVnaW9uLCBubyBjb25zaXN0ZW50IHNhbXBsaW5nIHRocm91Z2ggdGltZQoKYGBge3IgR0lOIHByb2Nlc3Npbmd9Cmdpbl9oYXVsc19rZWVwIDwtIE5VTEwKYGBgCgojIyMjR01FWAotSW4gdGhlIEd1bGYgb2YgTWV4aWNvLCB3ZSByZXN0cmljdGVkIG91ciBhbmFseXNpcyB0byBkYXRhIGZyb20gMTk4NCAtIDIwMDAgKGZ1bGwgcmFuZ2UgIDE5ODItMjAxNCk7IGlmIGFsbCB5ZWFycyBoYWQgYmVlbiB1c2VkLCB0aGUgbnVtYmVyIG9mIHNpdGVzIHNhbXBsZWQgaW4gYXQgbGVhc3QgODUlIG9mIHllYXJzICB3b3VsZCBkcm9wIGZyb20gMzkgdG8gMTMuIChCYXR0IGV0IGFsLiAyMDE3KQoKR01FWCBGYWxsIApgYGB7ciAgR01FWCBGYWxsIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkdNRVgtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdNRVgtRmFsbCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgOSwxMCwxMQotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgd2lsbCByZXN0cmljdCB0byA8LTg3LjUgbG9uZ2l0dWRlCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLVNlZWVtaW5nbHkgY29uc2lzdGVudCAjaGF1bHMgdGhyb3VnaCB0aW1lCgoKYGBge3IgR01FWC1GYWxsIHByb2Nlc3Npbmd9CmdtZXhfZmFsbF9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdNRVgtRmFsbCIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSkgJiBsb25naXR1ZGVfYWRqIDwgLTg3LjUsIGhhdWxfaWRdKQpgYGAKCkdNRVggU3VtbWVyCmBgYHtyICBHTUVYIFN1bW1lciB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCBtb250aHMgNSw2LDcKLUluIGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgdGhpcyB3aWxsIGJlIGZpeGVkIGluIHNwYXRpYWwgc3RhbmRhcmRpemF0aW9uIHN0ZXAKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIGJlZm9yZSAyMDA4IGFuZCAyMDA4IG9ud2FyZCB0aHJvdWdoIHRpbWUKLVNlZWVtaW5nbHkgY29uc2lzdGVudCAjaGF1bHMgdGhyb3VnaCB0aW1lCi1KdW1wIGZyb20gMjAwNyB0byAyMDA4LCB3aGVuIHNwYXRpYWwgZm9vdHByaW50IGluY3JlYXNlcywgc28gSSB3aWxsIG9ubHkgdXNlIGRhdGEgZnJvbSBiZWZvcmUgMjAwOAoKYGBge3IgR01FWC1TdW1tZXIgcHJvY2Vzc2luZ30KZ21leF9zdW1tZXJfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIgJiBtb250aCAlaW4lIGMoNSw2LDcpICYgeWVhciA8MjAwOCwgaGF1bF9pZF0pCmBgYAoKIyMjI0dPQQpgYGB7ciBHT0EgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR09BIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR09BIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCBtb250aHMgNiw3LDgKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgI2hhdWxzIHRocm91Z2ggdGltZQoKYGBge3IgR09BIHByb2Nlc3Npbmd9CmdvYV9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdPQSIgJiBtb250aCAlaW4lIGMoNiw3LDgpLCBoYXVsX2lkXSkKYGBgCgojIyMjR1JMLURFCi1Gcm9tIEJldWtob2YgZXQgYWwuIDIwMTksIGFsbCBzdXJ2ZXlzIGluIE9jdG9iZXIgYW5kIE5vdmVtYmVyCmBgYHtyIEdSTC1ERSB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHUkwtREUiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJHUkwtREUiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1ObyBtb250aHMgaW4gZGF0YSBzZXQsIGJ1dCBhY2NvcmRpbmcgdG8gQmV1a2hvZiBldCBhbC4gMjAxOSwgYWxsIHNhbXBsaW5nIGluIE9jdG9iZXIgYW5kIE5vdmVtYmVyIHNvIGtlZXAgYWxsIAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi0jIG9mIGhhdWxzIGRyb3BzIGJldHdlZW4gMTk5MSBhbmQgMTk5MiwgYW5kIGJvdGggMTk5MiBhbmQgMjAxNyBzbyBsaW1pdCB0byB5ZWFycyBiZXR3ZWVuICgxOTkzLTIwMTYpCgpgYGB7ciBHUkwtREUgcHJvY2Vzc2luZ30KZ3JsX2RlX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIiAmIHllYXIgJWluJSBjKDE5OTM6MjAxNiksIGhhdWxfaWRdKQpgYGAKCiMjIyNHU0wKCkdTTC1OCmBgYHtyIEdTTC1OIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDYsNyw4Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLSMgb2YgaGF1bHMgaW4gMjAwNSBpcyBoaWdoZXIsIHNvIHN0YXJ0IGluIDIwMDYKCmBgYHtyIEdTTC1OIHByb2Nlc3Npbmd9CmdzbF9uX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iICYgeWVhciA+IDIwMDUsIGhhdWxfaWRdKQpgYGAKCkdTTC1TCmBgYHtyIEdTTC1TIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDgsOSwxMAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKCmBgYHtyIEdTTC1TIHByb2Nlc3Npbmd9CmdzbF9zX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiICYgbW9udGggJWluJSBjKDg6MTApLCBoYXVsX2lkXSkKYGBgCgojIyMjSUNFLUdGUwoKYGBge3IgSUNFLUdGUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgMiwzLDQKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBJQ0UtR0ZTIHByb2Nlc3Npbmd9CmljZV9nZnNfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIiAmIG1vbnRoICVpbiUgYygyOjQpLCBoYXVsX2lkXSkKYGBgCgojIyMjSUUtSUdGUwoKYGBge3IgSUUtSUdGUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgMTAsMTEsMTIKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lIGFmdGVyIDIwMDQgKHNhbXBsZWQgZmFyIGVhc3QgaW4gMjAwMyBhbmQgMjAwNCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKCmBgYHtyIElFLUlHRlMgcHJvY2Vzc2luZ30KaWVfaWdmc19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiICYgbW9udGggJWluJSBjKDEwOjEyKSAmIHllYXIgID4gMjAwNCwgaGF1bF9pZF0pCmBgYAoKIyMjI0lTLU1PQUcgKGV4Y2x1ZGVkIGZyb20gZmluYWwgZGF0YXNldCkKYGBge3IgSVMtTU9BRyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVNhbXBsaW5nIHRvbyBzY2F0dGVyZWQgb3ZlciB0aW1lLCBleGNsdWRpbmcKCmBgYHtyIElTLU1PQUcgcHJvY2Vzc2luZ30KaXNfbW9hZ19oYXVsc19rZWVwIDwtIE5VTEwKYGBgCgojIyMjTUVESVRTCmBgYHtyIE1FRElUUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJNRURJVFMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJNRURJVFMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwICBhbGwgc3VydmV5cyBpbiBxdWFydGVyIDIKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBNRURJVFMgcHJvY2Vzc2luZ30KbWVkaXRzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIiwgaGF1bF9pZF0pCmBgYAoKCiMjIyNNUlQgKGV4Y2x1ZGVkIGZyb20gZmluYWwgZGF0YXNldCkKYGBge3IgTVJUIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk1SVCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJNUlQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk1SVCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVNhbXBsaW5nIGluY29uc2lzdGVudCwgZXhjbHVkZSBjb21wbGV0ZWx5CgpgYGB7ciBNUlQgcHJvY2Vzc2luZ30KbXJ0X2hhdWxzX2tlZXAgPC0gTlVMTApgYGAKCiMjIyNOQU0KCmBgYHtyIE5BTSB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOQU0iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOQU0iLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIHN1cnZleXMgaW4gMSBhbmQgMiAobW9zdCBjb25zaXN0ZW50bHkgc2FtcGxlZCkKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyBleGNlcHQgZm9yIDE5OTggKGV4Y2x1ZGUpCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMgZXhjZXB0IGZvciAxOTk4IChleGNsdWRlKQoKYGBge3IgTkFNIHByb2Nlc3Npbmd9Cm5hbV9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5BTSIgJiBtb250aCAlaW4lIGMoMSwyKSAmIHllYXIgIT0gMTk5OCwgaGF1bF9pZF0pCmBgYAoKCiMjIyNORVVTCgoKTkVVUyBTcHJpbmcKYGBge3IgTkVVUy1TcHJpbmcgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgMyw0LDUgbW9udGhzCi1JbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiBzdGFuZGFyZGl6YXRpb24gc3RlcAotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgKGVzcGVjaWFsbHkgYWZ0ZXIgODcsIHNob3VsZCBiZSBmaXhlZCB3aXRoIHN0YW5kYXJkaXphdGlvbiBzdGVwKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzIChlc3BlY2lhbGx5IGFmdGVyIDgxLCBzaG91bGQgYmUgZml4ZWQgd2l0aCBzdGFuZGFyZGl6YXRpb24gc3RlcCkKCmBgYHtyIE5FVVMtU3ByaW5nIHByb2Nlc3Npbmd9CiNjYWxjdWxhdGUgd2d0X2NwdWUgKGttXjIgYXZnIGZyb20gc2VhbiBMdWNleSkgYW5kIHdndF9oIChhbGwgYmlvbWFzcyB2YWx1ZXMgY2FsaWJyYXRlZCB0byBzdGFuZGFyZCBwcmUgMjAwOSAzMCBtaW51dGUgdG93KQpGaXNoR2xvYi4xMHllYXIuc3BwW3N1cnZleSA9PSAiTkVVUyIsIHdndF9oIDo9IHdndC8wLjVdW3N1cnZleSA9PSAiTkVVUyIsIHdndF9jcHVlIDo9IHdndC8wLjAzODRdW3N1cnZleSA9PSAiTkVVUyIsIG51bV9oIDo9IG51bS8wLjVdW3N1cnZleSA9PSAiTkVVUyIsIG51bV9jcHVlIDo9IG51bS8wLjAzODRdCgoKI2Fsc28sIGZvciBub3J0aGVhc3QsIHdlIGFyZSBnb2luZyB0byBkZWxldGUgYW55IGhhdWxzIGJlZm9yZSAyMDA5IHRoYXQgYXJlIG91dHNpZGUgb2YgKy8tIDUgbWludXRlcyBvZiAzMCBtaW51dGVzIGFuZCAyMDA5IGZvcndhcmQgdGhhdCBhcmUgb3V0c2lkZSBvZiArLy0gNSBtaW51dGVzIG9mIDIwIG1pbnV0ZXMKbmV1c19zcHJpbmdfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWygoc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIiAmIG1vbnRoICVpbiUgYygzOjUpICYgeWVhciA8IDIwMDkgJiAoaGF1bF9kdXIgPiAwLjQyICYgaGF1bF9kdXIgPCAwLjU4KSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciICYgbW9udGggJWluJSBjKDM6NSkgJiB5ZWFyID49IDIwMDkgJiAoaGF1bF9kdXIgPiAwLjI1ICAmIGhhdWxfZHVyIDwgMC40MikpKSwgaGF1bF9pZF0pCgoKYGBgCgpORVVTIEZhbGwKCmBgYHtyIE5FVVMtRmFsbCB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJORVVTLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJORVVTLUZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDksMTAsMTEgbW9udGhzCi1JbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiBzdGFuZGFyZGl6YXRpb24gc3RlcAotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgKGVzcGVjaWFsbHkgYWZ0ZXIgODQsIHNob3VsZCBiZSBmaXhlZCB3aXRoIHN0YW5kYXJkaXphdGlvbiBzdGVwKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzIChlc3BlY2lhbGx5IGFmdGVyIDg1LCBzaG91bGQgYmUgZml4ZWQgd2l0aCBzdGFuZGFyZGl6YXRpb24gc3RlcCkKCmBgYHtyIE5FVVMtRmFsbCBwcm9jZXNzaW5nfQoKI2Fsc28sIGZvciBub3J0aGVhc3QsIHdlIGFyZSBnb2luZyB0byBkZWxldGUgYW55IGhhdWxzIGJlZm9yZSAyMDA5IHRoYXQgYXJlIG91dHNpZGUgb2YgKy8tIDUgbWludXRlcyBvZiAzMCBtaW51dGVzIGFuZCAyMDA5IGZvcndhcmQgdGhhdCBhcmUgb3V0c2lkZSBvZiArLy0gNSBtaW51dGVzIG9mIDIwIG1pbnV0ZXMKbmV1c19mYWxsX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1soKHN1cnZleV91bml0ID09ICJORVVTLUZhbGwiICYgbW9udGggJWluJSBjKDksMTAsMTEpICYgeWVhciA8IDIwMDkgJiAoaGF1bF9kdXIgPiAwLjQyICYgaGF1bF9kdXIgPCAwLjU4KSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIiAmIG1vbnRoICVpbiUgYyg5LDEwLDExKSAmIHllYXIgPj0gMjAwOSAmIChoYXVsX2R1ciA+IDAuMjUgICYgaGF1bF9kdXIgPCAwLjQyKSkpLCBoYXVsX2lkXSkKYGBgCgojIyMjTklHRlMKTm9ydGhlcm4gSXJlbGFuZAoKU3ByaW5nIE5vcnRoZXJuIElyZWxhbmQgKHF1YXJ0ZXIgMSkKCmBgYHtyIE5JR0ZTIHNwcmluZyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgMiwzLDQgbW9udGhzCi1JbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiBzdGFuZGFyZGl6YXRpb24gc3RlcAotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgTklHRlMgMSBwcm9jZXNzaW5nfQpuaWdmc18xX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIgJiBtb250aCAlaW4lIGMoMiwzLDQpLCBoYXVsX2lkXSkKYGBgCgoKU3ByaW5nIE5vcnRoZXJuIElyZWxhbmQgKHF1YXJ0ZXIgMSkKCmBgYHtyIE5JR0ZTIGZhbGwgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDEwLDExIG1vbnRocwotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUsIGJ1dCBzaG91bGQgYmUgY2F1Z2h0IGluIHN0YW5kYXJkaXphdGlvbiBzdGVwCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBOSUdGUyA0IHByb2Nlc3Npbmd9Cm5pZ2ZzXzRfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOSUdGUy00IiAmIG1vbnRoICVpbiUgYygxMCwxMSksIGhhdWxfaWRdKQpgYGAKCiMjIyNOb3ItQlRTCgpPRyBGSVNIR0xPQiBpbmNsdWRlcyBOb3ItQlRTLTEgYXMgd2VsbCwgYnV0IHRoaXMgd2FzIG5vdCBzaGFyZWQgYnkgTC4gUGVjdWNoZXQsIGFuZCB0aGVyZWZvcmUgaWdub3JlZAoKTm9yLUJUUy0zCmBgYHtyIE5vci1CVFMtM30KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5vci1CVFMtMyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5vci1CVFMtMyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgOCw5LDEwCi1Tb21ld2hhdCBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTnVtYmVyIG9mIGhhdWxzIGlzIHZhcmlhYmxlLCBidXQgbm8gY2xlYXIgeWVhcnMgdG8gZXhjbHVkZQotTGF1cmVuZSBQZWN1Y2hldCAoVSBUcm9tc28pIHRvbGQgdXMgdGhhdCBvbmx5IHN1cnZleXMgMjAwNCBhbmQgb253YXJkcyB3b3JrIGZvciBiaW9kaXZlcnNpdHkgYW5hbHlzZXMKCgpgYGB7ciBOb3ItQlRTLTMgcHJvY2Vzc2luZ30Kbm9yX2J0c18zX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIiAmIG1vbnRoICVpbiUgYyg4OjEwKSAmIHllYXIgPj0gMjAwNCwgaGF1bF9pZF0pCmBgYAoKIyMjI05TLUlCVFMKCk5TLUlCVFMtMQpgYGB7ciBOUy1JQlRTLTF9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDEsMiwzCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTGluZWFyIGluY3JlYXNlIGluIHJpY2huZXNzLCBjdXRvZmYgb24gIyBoYXVscyBtb3JlIGNsZWFyCi1MaW5lYXIgaW5jcmVhc2UsIGJ1dCBzb21ld2hhdCBjbGVhciBicmVhayBiZXR3ZWVuIGxhdGUgNzBzIGFuZCBtaWQtODBzLCBvbmx5IGtlZXAgaGF1bHMgYWZ0ZXIgMTk4NAoKCmBgYHtyIE5TLUlCVFMtMSBwcm9jZXNzaW5nfQpuc19pYnRzXzFfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTEiICYgbW9udGggJWluJSBjKDE6MykgJiB5ZWFyID49IDE5ODQsIGhhdWxfaWRdKQpgYGAKCk5TLUlCVFMtMwpgYGB7ciBOUy1JQlRTLTN9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDcsOCw5Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotQ29uc2lzdGVudCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLUVhcmx5IHllYXJzIGxvd2VyICMgaGF1bHMsIHdpbGwgc3RhcnQgYXQgMTk5OAoKCmBgYHtyIE5TLUlCVFMtMyBwcm9jZXNzaW5nfQpuc19pYnRzXzNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTMiICYgbW9udGggJWluJSBjKDc6OSkgJiB5ZWFyID49IDE5OTgsIGhhdWxfaWRdKQpgYGAKCgojIyMjTloKCk5aLUNIQVQKCmBgYHtyIE5aLUNIQVR9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMTIsMSwyIChOT1RFIFRIQVQgVEhJUyBOWi1DSEFUIFNVUlZFWSBDUk9TU0VTIFlFQVIsIFNPIFdFIEFMUkVBRFkgTFVNUEVEIDEyIHdpdGggTkVYVCB5ZWFyKQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMgYWZ0ZXIgMTk5NQoKCmBgYHtyIE5aLUNIQVQgcHJvY2Vzc2luZ30KCgpuel9jaGF0X2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIgJiBtb250aCAlaW4lIGMoMTIsMSwyKSAmIHllYXIgPj0gMTk5NSwgaGF1bF9pZF0pCgpgYGAKCk5aLUVDU0kKCmBgYHtyIE5aLUVDU0l9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgNCw1LDYKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCi1HYXAgYmV0d2VlbiAxOTk1IGFuZCAyMDA1LCBidXQgd2UgaGF2ZSAxMCB0b3RhbCB5ZWFycyBzbyB3ZSdsbCBrZWVwIGZvciBub3cKCgpgYGB7ciBOWi1FQ1NJIHByb2Nlc3Npbmd9Cm56X2Vjc2lfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIiAmIG1vbnRoICVpbiUgYyg0LDUsNiksIGhhdWxfaWRdKQpgYGAKCk5aLVNVQkEKCmBgYHtyIE5aLVNVQkF9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMTEgYW5kIDEyCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLUZhciBtb3JlIGhhdWxzIGluIDE5OTBzLCB0aGVzZSBlYXJseSBzYW1wbGluZyB5ZWFycyB3aWxsIGJlIGV4Y2x1ZGVkIChzdGFydCBpbiAyMDAwKQoKCmBgYHtyIE5aLVNVQkEgcHJvY2Vzc2luZ30Kbnpfc3ViYV9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiICYgbW9udGggJWluJSBjKDExLDEyKSAmIHllYXIgPj0gMjAwMCwgaGF1bF9pZF0pCmBgYAoKTlotV0NTSQoKYGBge3IgTlotV0NTSX0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAzLDQKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotTGluZWFyIGRlY3JlYXNlIGluICMgb2YgaGF1bHMgdGhyb3VnaCB0aW1lLCBsZWF2ZSBvdXQgZmlyc3QgdHdvIHllYXJzIHdpdGggaGlnaGVzdCAjIGhhdWxzICg+PSAxOTk1KQoKCmBgYHtyIE5aLVdDU0kgcHJvY2Vzc2luZ30Kbnpfd2NzaV9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiICYgbW9udGggJWluJSBjKDMsNCkgJiB5ZWFyID49IDE5OTUsIGhhdWxfaWRdKQpgYGAKCiMjIyNQVC1JQlRTClBULUlCVFMKYGBge3IgUFQtSUJUU30KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA5LDEwLDExCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKCmBgYHtyIFBULUlCVFMgcHJvY2Vzc2luZ30KcHRfaWJ0c19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiICYgbW9udGggJWluJSBjKDksMTAsMTEpLCBoYXVsX2lkXSkKYGBgCgojIyMjUk9DS0FMTAoKYGBge3IgUk9DS0FMTH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA4LDkKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgoKYGBge3IgUk9DS0FMTCBwcm9jZXNzaW5nfQpyb2NrYWxsX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIgJiBtb250aCAlaW4lIGMoOCw5KSwgaGF1bF9pZF0pCmBgYAoKIyMjI1MtR0VPUkcKCmBgYHtyIFMtR0VPUkd9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMSBhbmQgMgotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIGV4Y2VwdCBmb3IgMjAwMywgd2lsbCBiZSBleGNsdWRlZAotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzLCBleGNlcHQgZm9yIDIwMTIsIHdpbGwgYmUgZXhjbHVkZWQKCgpgYGB7ciBTR2VvcmdlIHByb2Nlc3Npbmd9CnNfZ2Vvcmdfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTLUdFT1JHIiAmIG1vbnRoICVpbiUgYygxLDIpICYgISh5ZWFyICVpbiUgYygyMDAzLDIwMTIpKSwgaGF1bF9pZF0pCmBgYAoKIyMjI1NDUwoKU3ByaW5nCmBgYHtyIFNDUy1TUFJJTkd9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMiwzLDQKLUluY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUgKG5vcnRoZXJuIGxhdGl0dWRlcyBvbmx5IHNhbXBsZWQgaW4gZWFybHkgeWVhcnMpLCBvbmx5IGluY2x1ZGUgbG9uZ2l0dWRlcyA8IC02MiBhbmQgbGF0aXR1ZGVzIDwgNDUuNQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLU51bWJlciBvZiBoYXVscyBpcyB2YXJpYWJsZSwgZXhjbHVkZSBzdXBlciBsb3cgYW5kIGhpZ2ggbnVtYmVycyAoMTk4NSwxOTk0LDIwMTUsMjAxOSkKCgpgYGB7ciBzY3Nfc3ByaW5nIHByb2Nlc3Npbmd9CnNjc19zcHJpbmdfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIiAmIG1vbnRoICVpbiUgYygyLDMsNCkgJiAhKHllYXIgJWluJSBjKDE5ODUsMTk5NCwyMDE1LDIwMTkpKSAmIGxvbmdpdHVkZV9hZGogPCAtNjIgJiBsYXRpdHVkZSA8IDQ1LjUsIGhhdWxfaWRdKQpgYGAKClNVTU1FUgpgYGB7ciBTQ1MtU1VNTUVSfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDYsNyw4Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotUmljaG5lc3MgaW5jcmVhc2VzIGxpbmVhcmx5LCBub3QgYSBjbGVhciBicmVhayBwb2ludCwgdXNpbmcgYnJlYWtwb2ludCBmcm9tICMgb2YgaGF1bHMsIGJ1dCB3aWxsIGV4Y2x1ZGUgMjAxMCB3aGljaCBoYXMgYSB2ZXJ5IGhpZ2ggcmljaG5lc3MKLSMgSGF1bHMgaW5jcmVhc2VzIGxpbmVhcmx5IGZyb20gfjEyMCBpbiAxOTcwIHRvIH4yMjAgaW4gMjAyMCwgbm90IGEgY2xlYXIgYnJlYWtwb2ludCwgYnV0IHdpbGwgZ28gd2l0aCAxOTg2IGJlY2F1c2UgdGhlcmUgaXMgYSBqdW1wIGJldHdlZW4gODUgYW5kIDg2Ci1HZWFyIGNoYW5nZSBpbiAxOTgzIChFbGxpbmdzZW4gZXQgYWwuIDIwMTUpCgoKYGBge3Igc2NzX3N1bW1lciBwcm9jZXNzaW5nfQpzY3Nfc3VtbWVyX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIgJiBtb250aCAlaW4lIGMoNiw3LDgpICYgeWVhciA+PSAxOTg2ICYgeWVhciAhPSAyMDEwLCBoYXVsX2lkXSkKYGBgCgoKIyMjU0VVUwoKClNwcmluZwoKYGBge3IgU0VVUy1zcHJpbmd9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA0LDUsNgotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLUNvbnNpc3RlbnQgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGxvdyBpbiAxOTg5IGFuZCAyMDE4LCB3aWxsIGV4Y2x1ZGUKCmBgYHtyIHNldXNfc3ByaW5nIHByb2Nlc3Npbmd9CnNldXNfc3ByaW5nX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciICYgbW9udGggJWluJSBjKDQsNSw2KSAmIHllYXIgIT0gMTk4OSAmIHllYXIgIT0gMjAxOCwgaGF1bF9pZF0pCmBgYAoKClN1bW1lcgoKYGBge3IgU0VVUy1zdW1tZXJ9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA3LDgKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQotIyBIYXVscyBsb3cgaW4gZmlyc3QgeWVhciwgb3RoZXJ3aXNlIG9rYXksIGp1c3QgZXhjbHVkZSBmaXJzdCB5ZWFyICgxOTg5KQoKYGBge3Igc2V1c19zdW1tZXIgcHJvY2Vzc2luZ30Kc2V1c19zdW1tZXJfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIgJiBtb250aCAlaW4lIGMoNyw4KSAmIHllYXIgIT0gMTk4OSwgaGF1bF9pZF0pCmBgYAoKCkZhbGwKCmBgYHtyIFNFVVMtZmFsbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgOSwxMCwxMQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGxvdyBpbiBmaXJzdCB5ZWFyLCBvdGhlcndpc2Ugb2theSwganVzdCBleGNsdWRlIGZpcnN0IHllYXIgKDE5ODkpCgoKYGBge3Igc2V1c19mYWxsIHByb2Nlc3Npbmd9CnNldXNfZmFsbF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSkgJiB5ZWFyICE9IDE5ODksIGhhdWxfaWRdKQpgYGAKCgojIyMjU1dDLUlCVFMKClNjb3RsYW5kIFNoZWxmIFNlYQoKU1dDLUlCVFMgMQoKYGBge3IgU1dDLUlCVFMtMX0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAxLDIsMwotU29tZXdoYXQgaW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHRoaXMgc2hvdWxkIGJlIGFkZHJlc3NlZCBpbiBzcGF0aWFsIHN0YW5kYXJkaXphdGlvbiBwcm9jZWR1cmUgCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQotIyBIYXVscyBjb25zaXN0ZW50IGV4Y2VwdCBsb3cgaW4gMTk5NSwganVzdCBleGNsdWRlIDE5OTUKCgoKYGBge3Igc3djLWlidHMtMSBwcm9jZXNzaW5nfQpzd2NfaWJ0c18xX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIgJiBtb250aCAlaW4lIGMoMSwyLDMpICYgeWVhciAhPSAxOTk1LCBoYXVsX2lkXSkKYGBgCgpTV0MtSUJUUyA0CgpgYGB7ciBTV0MtSUJUUy00fQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDEwLDExLDEyCi1Tb21ld2hhdCBpbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lIChzb3V0aGVybiBsYXRpdHVkZXMgb25seSBzYW1wbGVkIGluIGVhcmx5IHllYXJzKSwgYnV0IHRoaXMgc2hvdWxkIGJlIGFkZHJlc3NlZCBpbiBzcGF0aWFsIHN0YW5kYXJkaXphdGlvbiBwcm9jZWR1cmUgCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZSAoZXNwZWNpYWxseSBhZnRlciBtaWQgOTBzKQotIyBIYXVscyBjb25zaXN0ZW50IGV4Y2VwdCBsb3cgYmVmb3JlIDE5OTUgYW5kIGxvdyBpbiAyMDEzLCBleGNsdWRlIHRoZXNlCgoKYGBge3Igc3djLWlidHMtNCBwcm9jZXNzaW5nfQpzd2NfaWJ0c180X2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIgJiBtb250aCAlaW4lIGMoMTAsMTEsMTIpICYgeWVhciAhPSAxOTk1ICYgeWVhciA+PSAxOTk1LCBoYXVsX2lkXSkKYGBgCgojIyMjV0NBTk4KCgpgYGB7ciBXQ0FOTn0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1IZXJlLCBvbmUgZXhjZXB0aW9uLCB3aWxsIHVzZSBmb3VyIG1vbnRocyAoNiw3LDgsOSkgYmVjYXVzZSBhbGwgc2FtcGxlZCBjb25zaXN0ZW50bHksIGFuZCBsb3dlciBsYXRpdHVkZSBhcmVhcyBzYW1wbGVkIGxhdGVyIGluIHRoZSBzdW1tZXIgY29uc2lzdGVudGx5Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKCgpgYGB7ciB3Y2FubiBwcm9jZXNzaW5nfQp3Y2Fubl9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIldDQU5OIiAmIG1vbnRoICVpbiUgYyg2OjkpLCBoYXVsX2lkXSkKYGBgCgojIyMjV0NUUkkKLUV4Y2x1ZGUgYmVjYXVzZSBvbmx5IDEwIHllYXJzIGFuZCBvdmVybGFwcyBzb21ld2hhdCB3aWl0aCBXQ0FOTgoKYGBge3Igd2N0cmkgcHJvY2Vzc2luZ30Kd2N0cmlfa2VlcCA8LSBOVUxMCmBgYAoKCiMjIyNaQUYKCkFUTApgYGB7ciBaQUYgQVRMfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1JbmNsdWRlIDEsMiwzCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUgYWZ0ZXIgMTk5MQoKCmBgYHtyIHphZiBhdGwgcHJvY2Vzc2luZ30KemFmX2F0bF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiICYgbW9udGggJWluJSBjKDE6MykgJiB5ZWFyID49IDE5OTEsIGhhdWxfaWRdKQpgYGAKCgpJTkQKYGBge3IgWkFGIElORH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotSW5jbHVkZSA0LDUsNgotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGNvbnNpc3RlbnQgYmVmb3JlIDIwMDEsIGFuZCB0aGVuIGFsc28gaW4gMjAwNSBhbmQgMjAwOS0yMDEwCgoKYGBge3IgemFmIGluZCBwcm9jZXNzaW5nfQp6YWZfaW5kX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIgJiBtb250aCAlaW4lIGMoNDo2KSAmIHllYXIgJWluJSBjKDE5ODU6MjAwMSwyMDA1LCAyMDA5LDIwMTApLCBoYXVsX2lkXSkKYGBgCgoKIyMjI0NvbWJpbmUgYWxsIGxpc3RzIHRoYXQgaGF2ZSBfa2VlcApgYGB7ciBjb21iaW5lIGxpc3RzfQojYWxsIG9iamVjdHMgd2l0aCBfa2VlcApsaXN0X29iaiA8LSBscyhwYXR0ZXJuID0gIl9rZWVwIikKCiNjb21iaW5lCmZpc2hnbG9iX2hhdWxpZHNfdG9fa2VlcCA8LSB1bmxpc3QobGFwcGx5KGxpc3Rfb2JqLCBnZXQpKSAjMjI5ODk0IGhhdWxzIChTdGFydGVkIHdpdGggMjc4NDA1KQoKRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhbiA8LSBGaXNoR2xvYi4xMHllYXIuc3BwW2hhdWxfaWQgJWluJSBmaXNoZ2xvYl9oYXVsaWRzX3RvX2tlZXAsXQoKI1JlcXVpcmUgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBmb3IgYWxsIG9ic2VydmF0aW9ucwpGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuIDwtIEZpc2hHbG9iLjEweWVhci5zcHBfbWFudWFsY2xlYW5bY29tcGxldGUuY2FzZXMoRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhblssLihsYXRpdHVkZSwgbG9uZ2l0dWRlKV0pXSAjY2hlY2sgdGhhdCB0aGlzIHdvcmtzCgojYW5vdGhlciBjaGVjayBmb3IgIyB5ZWFycyBzYW1wbGVkCiNuZXcgcm93IGZvciB0b3RhbCBudW1iZXIgb2YgeWVhcnMgc2FtcGxlZApGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuWyx5ZWFyc19zYW1wbGVkIDo9IGxlbmd0aCh1bmlxdWUoeWVhcikpLC4oc3VydmV5X3VuaXQpXQpWaWV3KHVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuWywuKHN1cnZleV91bml0LCB5ZWFyc19zYW1wbGVkKV0pKQoKI3NhdmUKc2F2ZVJEUyhGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YSIsImNsZWFuZWQiLCJGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuLnJkcyIpKQoKYGBgCgoKIyMjI1NvbWUgc3VydmV5cyBzYW1wbGUgdGhyb3VnaCBlbmQgb2YgeWVhciwgZml4IHRoZXNlCi1OT1RFIFRIQVQgVEhJUyBOWi1DSEFUIFNVUlZFWSBDUk9TU0VTIFlFQVIsIFNPIExVTVAgMSBhbmQgMiB3aXRoIHByZXZpb3VzIHllYXIK
>>>>>>> 8d88acff98c502edab8abae4316aaab0dece37b7